设计模式【七】:桥接
伪代码
class ExampleClass{
public:
ExampleClass(ExampleImp* imp){
_imp = imp;
}
virtual void exampleClassMethod1();
virtual void exampleClassMethod2();
virtual void exampleImpMethod1();
virtual void exampleImpMethod2();
private:
ExampleImp* _imp;
}
class ImpClass{
}
class ConcreteImp1: public ImpClass{
}
class ConcreteImp2: public ImpClass{
}
class ConcreteClass1: public ExampleClass{
public:
ConcreteClass1();
}
ConcreteClass1::exampleImpMethod1(){
_imp->method1();
}
ConcreteClass1 class1Imp1 = new ConcreteClass1(new ConcreteImp1());
ConcreteClass1 class1Imp2 = new ConcreteClass1(new ConcreteImp2());
ConcreteClass2 class2Imp1 = new ConcreteClass2(new ConcreteImp1());
ConcreteClass2 class2Imp2 = new ConcreteClass2(new ConcreteImp2());
优缺点
优点
- 将接口与具体实现解耦。更改实现类(伪代码中的ImpClass)不影响接口。
- 更好的可扩展性。抽象类与实现类可以分别扩展。
- 更简洁的继承树。注意,在伪代码中我们为了得到四个实例,设计了2+2=4个类,而不是22=4个类,这是特殊情况。假如我们为了得到六个实例,采用桥接模式我们设计2+3=5个类,而不是采用树形继承结构的23=6个类。
何时使用
- 需要避免接口与实现的永久绑定,比如需要运行时切换实现方式。
- 接口与是实现分别需要继承,而且可能需要将不同层次的继承组合起来。
- 不希望抽象类的实现更改导致重编译。
- 希望在不同接口之间共享实现。
实现时技巧
- 假如只有一个实现类时,可能不需要桥接模式。因为此时桥接模式需要n+1个类,而树形继承仅需n个类。
- 注意对多个实现类的管理。比如设置一个哈希表存储所有实现类,这样在接口的构造函数就可以选择对应的实现类。或者在构造函数使用默认的类,在实例化后根据实际情况更改设置。
- 考虑共享实现类。