背景
将类的功能层次结构与实现层次结构分离
类的功能层次结构
使用继承不断地扩展子类,每一个子类对应一个新的功能,即不断增加功能
- 父类具有基本功能
- 在子类中增加新的功能
类的实现层次结构
可以看成不断增加实现
- 父类通过声明抽象方法来定义接口
- 子类通过实现具体方法来实现接口
当类的结构层次只有一层时,功能层次结构和实现层次结构混杂在一个层次结构当中,这样会使类变得更加复杂;
此时需要把功能层次结构和实现层次结构分离为两个独立的类层次结构,同时使用桥接模式把它们联系起来。
登场角色
Abstraction 抽象化
该角色位于 类的功能层次结构 最上层
RefinedAbstraction 改善后的抽象化
在Abstraction的基础上增加新的功能
Implementor 实现者
该角色位于 类的实现层次结构 最上层
ConcreteImplementor 具体实现者
负责 实现 在Implementor角色中定义的 接口
类图
以打印某个字符串为例,实现的功能:打印多次,且可以以不同形式打印(即有不同的实现方法)
示例代码
Abstraction 类
public class Display {
private DisplayImpl displayImpl;
public Display(DisplayImpl displayImpl) {
this.displayImpl = displayImpl;
}
public void open() {
displayImpl.rawOpen();
}
public void print() {
displayImpl.rawPrint();
}
public void close() {
displayImpl.rawClose();
}
public final void display() {
open();
print();
close();
}
}
RefinedAbstraction类:打印具体的次数
public class CountDisplay extends Display{
public CountDisplay(DisplayImpl displayImpl) {
super(displayImpl);
}
public void multiDisplay(int count) {
open();
for (int i = 0; i < count; i++) {
print();
}
close();
}
}
Implementor 实现者
public abstract class DisplayImpl {
public abstract void rawOpen();
public abstract void rawPrint();
public abstract void rawClose();
}
ConcreteImplementor 具体实现者
public class StringDisplayImpl extends DisplayImpl {
private String name;
private int width;
public StringDisplayImpl(String name) {
this.name = name;
this.width = name.getBytes().length;
}
@Override
public void rawOpen() {
printLine();
}
@Override
public void rawPrint() {
System.out.println("|" + name + "|");
}
@Override
public void rawClose() {
printLine();
}
private void printLine() {
System.out.print("+");
for (int i = 0; i < width; i++) {
System.out.print("-");
}
System.out.println("+");
}
}
功能分析
- 分开更容易扩展,将类的 实现结构层次 与 类的功能结构 层次分离,有利于独立地对他们进行扩展;
- 继承是强关联,委托是弱关联;委托即是一种组合关系