概述
Bridge的意思是桥梁。就像现实世界中,桥梁的功能是将河流的两侧连接起来一样,Bridge模式的作用也是将两样东西连接起来,它们分别是类的功能层次结构和类的实现层次结构。
Bridge模式的作用是在类的功能层次结构和类的实现层次结构之间搭建桥梁。
类的层次结构的两个作用
1、希望增加新功能时
假设现在有一个类Something。当我们想在Something中增加新功能时(向增加一个具体的方法时),会编写一个Something类的子类(派生类),即SomethingGood类。这样就构成了一个小小的类层次结构。
Something
| ——SomethingGood
这就是为了增加新功能而产生的层次结构。
- 父类具有基本功能。
- 在子类中增加新功能。
以上这种层次结构被称为类的功能层次结构
注意,通常来说,类的层次结构关系不应当过深。
2、希望增加新的实现时
抽象类声明了一些抽象方法,定义了接口(API),然后子类负责去实现这些抽象方法。父类的任务是通过声明抽象方法的方式定义接口(API),而子类的任务是实现抽象方法。正是由于父类和子类的这种任务分担,我们才可以编写出具有高可替换性的类。
AbstractClass
| ——ConcreteClass |
但是,这里的类的层次结构并非用于增加功能,也就是说,这种层次结构并非用于方便我们增加新的方法。它的真正作用是帮助我们实现下面这样的任务分担。
- 父类通过声明抽象方法来定义接口(API)
- 子类通过实现具体方法来实现接口(API)
这种层次结构被称为类的实现层次结构。
3、类的层次结构的混杂与分离
通过前面的讲述,我们应该理解了类的功能层次结构与类的实现层次结构。那么,当我们想要编写子类时,就需要像这样先确认自己的意图:就是我是要增加功能呢?还是要增加实现呢?当类的层次结构只有一层时,功能层次与实现层次结构是混杂在一个层次结构中的。这样很容易使类的层次结构变得复杂,也难以透彻地理解类的层次结构。因为自己难以确定究竟应该在类的哪一个层次结构中去增加子类。
因此我们需要将类的功能层次结构与类的实现层次结构分离为两个独立的类层次结构。当然,如果只是简单地将它们分开,两者之间必然会缺少联系。所以我们还需要在它们之间搭建一座桥梁。
扩展思路的要点
分开后更容易扩展
Bridge模式的特征是将类的功能层次结构与类的实现层次结构分离开了。将类的这两个层次结构分离开有利于独立地对它们进行扩展。
当想要增加功能时,只需要在类的功能层次结构增加类即可,不必对类的实现层次结构做任何修改。而且,增加后的功能可以被所有的实现使用。
继承是强关联,委托是弱关联
虽然使用继承很容易扩展类,但是类之间也形成了一种强关联关系。如果想要很轻松地改变类之间的关系,使用继承就不适合了,因为每次改变类之间的关系都需要修改程序。这时,我们可以使用委托来代替继承的关系。
继承是强关联关系,委托是弱关联关系。在设计类的时候,我们必须充分理解这一点。