桥接模式(Bridge Pattern),顾名思义。类似与桥的功能。联通两个不同领域。其实这个设计模式的作业也是如此。在Java世界中。它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。
常见结构如下:
可以看到,桥接模式的核心在于抽象类依赖接口的具体实现。这样就能使得接口的实现类和抽象类可以自由变化。抽象类来维护与接口的关系。
还是举个栗子。
场景①:用Java语言来描述彩笔的关系。
分析: 彩笔是一个接口。不同颜色的彩笔是其子类。
代码实现如下:
彩笔接口
public interface IColourPen {
/**
* 画画
* @param content 要画的类容
*/
void draw(String content);
}
红色彩笔
public class RedColourPen implements IColourPen {
@Override
public void draw(String content) {
System.out.println(String.format("您正在使用%s彩笔画画。类容为:%s", "红色", content));
}
}
黑色彩笔
public class BlackColourPen implements IColourPen {
@Override
public void draw(String content) {
System.out.println(String.format("您正在使用%s彩笔画画。类容为:%s", "黑色", content));
}
}
测试:
IColourPen colourPen = new RedColourPen();
colourPen.draw("a dog");
输出:
您正在使用红色彩笔画画。类容为:a dog
场景②:我要使用彩笔来画不同的物体。例如人的肖像图,风景图等等。
分析:这个场景需要抽象画画的类容。不同的类容画画的过程不一样。而画画又要依赖彩笔。
代码实现如下:
画画的类容抽象和动作抽象:
public abstract class AbstractDrawContent {
protected IColourPen colourPen ;
public AbstractDrawContent(IColourPen colourPen) {
this.colourPen = colourPen;
}
/**
* 模版方法设计模式。
* 模版方法。给子类实现。画不同的类容。就给不同的实现
*/
public abstract void draw();
}
画人物肖像实现:
public class PortraitsDrawContentImpl extends AbstractDrawContent {
public PortraitsDrawContentImpl(IColourPen colourPen) {
super(colourPen);
}
@Override
public void draw() {
colourPen.draw("人物肖像");
}
}
画风景图实现:
public class PaysageDrawContentImpl extends AbstractDrawContent {
public PaysageDrawContentImpl(IColourPen colourPen) {
super(colourPen);
}
@Override
public void draw() {
colourPen.draw("风景画");
}
}
综合上面两部再来看:
这就是桥接模式模式了。
再来看下测试结果:
AbstractDrawContent drawContent = new PaysageDrawContentImpl(new RedColourPen());
drawContent.draw();
输出结果:
您正在使用红色彩笔画画。类容为:风景画
到这里桥接设计模式的基本结构就介绍清楚了。可以看到桥接设计模式是模版方法设计模式的进阶版。