Bridge模式
应用场景
需要将类的功能层次结构和类的实现层次结构连接起来,增加功能和实例
本质
- 分离抽象和实现
优点
- 便于扩展
缺点
- 暂无
角色
-
Abstraction (抽象化)
该角色位于“类的功能层次结构”的最上层。它使用Implementor角色的方法定义了基本的功能。该角色中保存了Implementor 角色的实例。在示例程序中,由Display类扮演此角色。 -
RefinedAbstraction (改善后的抽象化)
在Abstraction角色的基础上增加了新功能的角色。在示例程序中CountDisplay类扮演此角色。 -
Implementor (实现者)
该角色位于“类的实现层次结构”的最上层。它定义了用于实现Abstaetio角色的接口(API)的方法。在示例程序中,由DisplayImpl类扮演此角色。 -
Concretelmplementor (具体实现者)
该角色负责实现在lmplementor角色中定义的接口(API)在示例程序中,由StringDisplayImpl类扮演此角色。
设计模式的类图
示例程序
示例程序的类图
示例代码
实现最顶层:
public abstract class DisplayImpl {
public abstract void rawOpen();
public abstract void rawPrint();
public abstract void rawClose();
}
具体实现类:
public class StringDisplayImpl extends DisplayImpl {
private String string; // 要显示的字符串
private int width; // 以字节单位计算出的字符串的宽度
public StringDisplayImpl(String string) { // 构造函数接收要显示的字符串string
this.string = string; // 将它保存在字段中
this.width = string.getBytes().length; // 把字符串的宽度也保存在字段中,以供使用。
}
public void rawOpen() {
printLine();
}
public void rawPrint() {
System.out.println("|" + string + "|"); // 前后加上"|"并显示
}
public void rawClose() {
printLine();
}
private void printLine() {
System.out.print("+"); // 显示用来表示方框的角的"+"
for (int i = 0; i < width; i++) { // 显示width个"-"
System.out.print("-"); // 将其用作方框的边框
}
System.out.println("+"); // 显示用来表示方框的角的"+"
}
}
功能类顶层:
public class Display {
private DisplayImpl impl;
public Display(DisplayImpl impl) {
this.impl = impl;
}
public void open() {
impl.rawOpen();
}
public void print() {
impl.rawPrint();
}
public void close() {
impl.rawClose();
}
public final void display() {
open();
print();
close();
}
}
具体功能类:
public class CountDisplay extends Display {
public CountDisplay(DisplayImpl impl) {
super(impl);
}
public void multiDisplay(int times) { // 循环显示times次
open();
for (int i = 0; i < times; i++) {
print();
}
close();
}
}
测试类:
public class Main {
public static void main(String[] args) {
Display d1 = new Display(new StringDisplayImpl("Hello, China."));
Display d2 = new CountDisplay(new StringDisplayImpl("Hello, World."));
CountDisplay d3 = new CountDisplay(new StringDisplayImpl("Hello, Universe."));
d1.display();
d2.display();
d3.display();
d3.multiDisplay(5);
}
}
拓展思路
- 继承是强关联关系,委托是弱关联关系。
- 面向对象最终要做到:松耦合、高内聚
- 协议:横向
- 接口:纵向
相关设计模式
-
Template Method模式
在Template Method模式中使用了“类的实现层次结构”。父类调用抽象方法,而子类实现抽象方法。 -
Abstract Factory模式
为了能够根据需求设计出良好的ConcreteImplementor角色,有时我们会使用Abstract Factory模式。 -
Adapter模式
使用Bridge模式可以达到类的功能层次结构与类的实现层次结构分离的目的,并在此基础上使这些层次结构结合起来。
而使用Adapter模式则可以结合那些功能上相似但是接口( API )不同的类
满足的原则
- 开放封闭原则
- 里氏代换原则
- 组合复用原则