定义
如果软件系统中某个类存在两个独立变化的维度,通过该模式可以将这两个维度分离出来,使两者可以独立扩展,让系统更加符合“单一职责原则”。与多层继承方案不同,它将两个独立变化的维度设计为两个独立的继承等级结构, 并且在抽象层建立一个抽象关联,该关联关系类似一条连接两个独立继承结构的桥,故名桥接模式。
UML类图
角色和职能
- Abstract(抽象类):用于定义抽象类的接口,它一般是抽象类而不是接口,其中定义了 一个Implementor(实现类接口)类型的对象并可以维护该对象,它与Implementor之间具有关 联关系,它既可以包含抽象业务方法,也可以包含具体业务方法。
- RefinedAbstraction(扩充抽象类):扩充由Abstraction定义的接口,通常情况下它不再是抽象类而是具体类,它实现了在Abstraction中声明的抽象业务方法,在RefinedAbstraction中可以 调用在Implementor中定义的业务方法。
- Implementor(实现类接口):定义实现类的接口,这个接口不一定要与Abstraction的接口完 全一致,事实上这两个接口可以完全不同,一般而言,Implementor接口仅提供基本操作,而 Abstraction定义的接口可能会做更多更复杂的操作。Implementor接口对这些基本操作进行了声 明,而具体实现交给其子类。通过关联关系,在Abstraction中不仅拥有自己的方法,还可以调 用到Implementor中定义的方法,使用关联关系来替代继承关系。
- ConcreteImplementor(具体实现类):具体实现Implementor接口,在不同的 ConcreteImplementor中提供基本操作的不同实现,在程序运行时,ConcreteImplementor对象将 替换其父类对象,提供给抽象类具体的业务操作方法。
思考流程
- 识别出一个类所具有的两个独立变化的维度,将他们设计为两个独立的继承等级结构,为两个维度都提供抽象层。
- 通常情况下,我们将具有两个独立变化维度的类的一些普通业务方法和与之关系最密切的维度设计为“抽象类”层次结构(抽象部分),而将另一个维度设计为“实现类”层次结构(实现部分)。(例如: 对于毛笔而言,由于型号是其固有的维度,因此可以设计一个抽象的毛笔类,在该类中声明 并部分实现毛笔的业务方法,而将各种型号的毛笔作为其子类;颜色是毛笔的另一个维度, 由于它与毛笔之间存在一种“设置”的关系,因此我们可以提供一个抽象的颜色接口,而将具体 的颜色作为实现该接口的子类。)