第一部分:结构型模式
1. Bridge模式
a. 问题
将抽象部分与实现部分分离,使他们都可以独立的发生变化
b.结构图
Abstraction(抽象类):里面包含 Implementor 实现类的指针,如开关,里面有一个指向电器的指针
RefinedAbstraction(扩充抽象类):具体的开关,可以扩充开关功能,不同的开关功能可能不同
Implementor(实现类接口):电器抽象类,与abstract不一定一致,自己按照电器类型定义
ConcreteImplementor(具体实现类):不同的电器有不同的功能
在Bridge模式的结构图中可以看到,系统被分为两个相对独立的部分,左边是抽象部分,右边是实现部分,这两个部分可以互相独立地进行修改:如增加了一个新电器,只需在右面加一个电器就好了,原来的开关都可以用于控制这个电器,开关不用改。如果通过继承来实现,开关A派生出两个电器A00,A01,又有新的开关A1控制A00,A01,如果只有一个基类A的话,这样就会形成一个树形结构,越来越庞大,一致继承继承,多重继承。所以抽象出一个实现类B电器类。
实际上上面使用Bridge模式和使用带来问题方式的解决方案的根本区别在于是通过继承还是通过组合的方式去实现一个功能需求
c. 代码实现
https://blog.csdn.net/liang19890820/article/details/79501177
电器和开关的例子
d. 优缺点
优点:
- 不想使用继承或者因多重继承导致类的个数极具增加,可以使用桥接模式
- 一个系统存在多个(≥ 2)独立变化的维度,且这多个维度都需要独立进行扩展。
- 程序运行时可以动态将一个抽象化子类的对象和一个实现化子类的对象进行组合,即系统需要对抽象化角色和实现化角色进行动态耦合
缺点: - 桥接模式要求正确识别出系统中两个独立变化的维度,需要经验