动机:当一个抽象可能有多个实现时,通常使用继承来协调它们。抽象类定义对该抽象的接口,而具体的子类则用不同方式加以实现。但是此方法优势不够灵活。继承机制将抽象部分与它的实现部分固定在一起,使得难以对抽象部分和实现部分独立地进行修改,扩充和复用。为了解决这个问题,对抽象子类的所有操作都有实现这个抽象接口的实现的子类所实现。这样将抽象类与实现抽象的类分离开来,它们之间的关系称为桥接,它在抽象类与它的实现之间起到了桥梁的作用,可以是它们独立的变化。
适用性:你不希望抽象和它的实现部分之间有一个固定的绑定关系;类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充;对一个抽象的实现部分的修改应对客户不产生影响即客户的代码不需要重新编译;你相对客户完全隐藏抽象的实现部分;有许多类要生成,但实现类中不必实现所有的接口说明你必须将一个对象分解成两个部分;你想在多个类中共享但是同时要求客户不必知道。
结构如下:
参与者:
Abstraction:定义抽象类的接口,维护一个指向Implementor的指针
RefindedAbstraction: 扩充由Abstraction的接口
Implementor: 定义实现类的接口,该接口不一定要和Abstraction的接口完全一致。一般来讲,Implementor接口只提供基本操作,而Abstraction则定义这些基本操作的较高层次的操作。
ConcreteImplementor:实现Implementor接口并定义它的具体表现。
效果:
分离接口及其实现部分;提高可扩充性;实现细节对客户透明。
代码实现如下:
1 |
|