问题:
当存在多个独立的变化维度时,如果仍采用多层继承结构,会急剧的增加类的个数,因此可以考虑将各个维度分类,使他们不相互影响。
定义:
将抽象部分与它的实现部分进行分离,抽象部分只保留最为本质的部分,而其他对该类的扩展均放到实现部分,进而使他们独立地变化。并在抽象层建立耦合,方便对各个维度进行扩展。
结构图:
- Abstracttion:抽象类,是整个桥接模式所表述的各种类别的核心类,例如毛笔-颜色中的毛笔,图片-操作系统中的图片。首先它定义了扩展类中的接口,另外它还定义了一个关于实现类Implementor的成员对象impl,由此来与实现维度产生联系。
- RefineAbstracttion:扩充抽象类,实现了抽象类定义的接口,即实现核心类的扩展操作,并且可以调用impl相关的业务方法。
- Implementor:实现类接口,定义了与Abstraction另外一个维度的基本接口,其它继承类在此接口进行实现和扩展。Implementor的接口设计成Abstraction类的另一类属性和行为,对其进行修饰和相关操作。
- ConcreteImple:具体实现类,实现了Implementor定义的接口,再具体程序中将替换父类,做具体的执行操作。
注意:
-
使用桥接模式前,需要识别出两个独立变化的维度,然后将它们设计为两个独立的继承等级结构,并在抽象层建立耦合。对于固有特征可以设计为抽象部分,对于行为和属性可以设计为实现类。行为和其它属性与固有特征存在一种设置关系,可以使用成员对象进行关联。
-
桥接模式和适配器模式的联合使用:桥接模式一般用于系统初步设计阶段,分析系统有哪些独立变化的维度,然后将其分解并在抽象层建立耦合。当初步设计完成,并在后期发现无法与已有类无法协同工作,可以使用适配器模式。
优点:
- 分离抽象和实现两个维度,解耦抽象和实现的绑定关系,使得各个维度可以独立变化。提高系统的可扩展性,不需要修改原有系统。
- 是设计模式基本原则的很好体现,符合开闭原则,单一职责原则,合成复用原则,里氏替换原则,依赖倒置原则,接口隔离原则等。
缺点:
- 在分析和辨别两个维度的时候有一定的困难,并且增加系统复杂度。
适用情景:
- 含有多个维度的独立变化的类结构,每个维度都可以扩展。
- 避免在层次之间使用继承关系,通过桥接模式可以使用组合复用原则进行扩展。
实例: