bigtalk.jpg
第22章 手机软件何时统一——桥接模式
概念
将抽象部分与实现部分分离,使它们可以独立变化。
这里的抽象和实现不是抽象类和派生类,而是当一个事物可以从多个角度看待的时候,将这些多个角度下看到的实现方式独立出来让它们各自变化互不影响(否则可能会出现组合爆炸)。
原则
这里更多的是讲述一种原则:合成/聚合复用原则,即尽量使用合成/聚合,尽量不要使用类继承。
尽量用聚合/组合的关系,少用继承的关系,因为继承关系的耦合性太强,是 is-a
的时候才用聚合,否则会导致变化时牵连的类很多。
采用聚合/组合关系,两个类之间好像一座桥所以叫桥接模式。
实现包括:
- 抽象类:抽象(Abstractor)里面包含多个实现类对象(组合/聚合),派生(RefinedAbstraction)里面有被提炼的抽象操作。
- 实现类:抽象(Implementor)里面包含公共的操作接口,被抽象类包含,派生(ConcreteImplementorX)里面包含公共操作的具体实现。
类图实现:
21_bridge.png
客户端使用:
21_bridge_use.png
场景
当发现可以多个角度去分类实现对象的时候,只用继承会导致大量的类增加(比如不同角度不同因素的组合爆炸), 这个时候就考虑桥接模式。将这些角度分离出来,让它们独立变化(M*N的关系变成M+N的关系)。
例子:手机品牌A、手机品牌B……, 软件1、软件2……
设计成:
手机为抽象类(Mobile),软件为实现类(Soft),手机包含软件;
具体手机品牌继承手机类(MobileA,MobileB,...),具体软件继承软件类(Soft1,Soft2,...);
软件类有操作 =Soft.Run()=, 手机可以设置某软件 =Mobile.SetSoft(Soft)=, 并且运行软件用接口 =Mofile.Exec()=.
反之如果用继承,会出现手机品牌A软件1, 手机品牌2软件2,手机品牌B软件1,手机品牌B软件2,每增加一个软件或品牌,相应要增加很多类。