Bridge Pattern 对象结构型模式
意图
将抽象部分与其实现部分分离,使它们都可以独立地变化
结构
其中:
- Abstraction 定义抽象类的接口,维护一个指向 Implementor 类型对象的指针
- RefinedAbstraction 扩充由 Abstraction 定义的接口
- Implementor 定义实现类的接口,该接口不一定要与 Abstraction 的接口完全一致;事实上这两个接口可以完全不同 一般来说,Implementor 接口仅提供基本操作,而 Abstraction 定义了基于这些基本操作的较高层次的操作
- ConcreteImplementor 实现 Implementor 接口并定义它的具体实现
适用性
Bridge 模式适用于:
- 不希望在抽象和它的实现部分之间有一个固定的绑定关系。例如,这种情况可能是因为,在程序运行时刻实现部分应可以被选择或者切换
- 类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充。这是 Bridge 模式使得开发者可以对不同的抽象接口和实现部分进行组合,并分别对它们进行扩充
- 对一个抽象的实现部分的修改应对客户不产生影响,即客户代码不必重新编译
- (C++) 想对客户完全隐藏抽象的实现部分
- 有许多类要生成的类层次结构
- 想在多个对象间共享实现 (可能使用引用计数) ,但同时要求客户并不知道这一点
例子
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
public class main {
public static void main(String[] args) {
Product ProductA1 = new ProductA();
Product ProductA2 = new ProductA();
Color red = new Red();
ProductA1.setName("P-A1");
ProductA1.setColor(red);
ProductA1.Operation;
Color blue = new Blue();
ProductA1.setName("P-A2");
ProductA1.setColor(blue);
ProductA1.Operation;
}
}
abstract class Product{
private String name;
protected Color color;
public void setName(String name){
this.name = name;
}
public String getName(){
return this.name;
}
public setColor(Color color){
this.color = color;
}
public abstract void Operation();
}
class ProductA extends Product{
@Override
public void Operation(){
color.OperationImp(this.getName());
}
}
class Color{
public void OperationImp(String name);
}
class Red extends Color{
@Override
public void OperationImp(String name){
System.out.println(name + ": red")
}
}
class Blue extends Color{
@Override
public void OperationImp(String name){
System.out.println(name + ": blue")
}
}