桥接模式用于将抽象部分与它的实现部分分离,使他们可以独立的变化。这句话不是很好理解,我来简单翻译一下,大概就是将一个事物的两个维度的变化解耦开。
举个例子
我们来看个毛笔和蜡笔的例子,假设我们需要大中小三种型号的画笔,能够绘制5种不同的颜色,如果使用蜡笔那么我们需要15只,如果使毛笔的话,我们只需要3只,外加5种颜料盒就OK。这里的关键点在于,毛笔可以做到将笔的型号和颜色解耦开,使他们可以独立的变化,这就是桥接模式。
先来看一下UML图:
再来看一下具体代码如何实现。
public interface Color {
String draw();
}
- 1.
- 2.
- 3.
红颜色
public class RedColor implements Color {
@Override
public String draw() {
return "红色";
}
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
定义抽象的毛笔
public abstract class BrushPen {
//桥接画笔和颜色
protected Color color;
public void setColor(Color color){
this.color = color;
}
public abstract void operation();
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
定义一个小号的毛笔
public class SmallBrushPen extends BrushPen {
@Override
public void operation() {
System.out.println(this.color.draw() + " 小号毛笔");
}
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
客户端这样使用桥接模式
public class BridgeBrushPenDemo {
public static void main(String[] args){
BrushPen smallBrushPen = new SmallBrushPen();
//红色小号毛笔
smallBrushPen.setColor(new RedColor());
smallBrushPen.operation();
//绿色小号毛笔
smallBrushPen.setColor(new Green());
smallBrushPen.operation();
}
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
总结
桥接模式是结构型模式,当事物涉及多个维度的变化时,使用桥接模式可以大大降低系统复杂度,这个模式也是我认为的最难理解的一个设计模式。