这是两个维度的变化。抽象层次会改变,实现层次也会改变。结构型模式,是对象间的组合关系。桥接模式解耦了抽象和实现之间固有的绑定关系,使得抽象和实现可以沿着各自的维度来变化。不同的抽象结合不同的实现对象,组合成不同的新功能对象。
面临问题:
一个抽象类的派生类必须使用多个实现,但是却不能出现类数量的爆炸性增长。
举例来说,假设现在我们需要为某个餐厅制造菜单,餐厅供应牛肉面、猪肉面……,而且顾客可根据自己的口味选择是否添加辣椒。此时就产生了一个问题,我们如何来应对这种变化:我们是否需要定义辣椒牛肉面、无辣牛肉面、辣椒猪肉面、无辣猪肉面4个子类?如果餐厅还供应羊肉面、韭菜面……呢?如果添加辣椒时可选择无辣、微辣、中辣、重辣……风味呢?那程序岂非一直忙于定义子类?解决方案:
为所有实现定一个接口,供抽象类的所有派生类使用。是把变化部分抽象出来,使变化部分与主类分离开来,从而将多个维度的变化彻底分离。最后提供一个管理类来组合不同维度上的变化,通过这种组合来满足业务的需要。
对于上面的例子来说,实现类有不同的辣椒口味,是一个维度的变化,需要定义一个辣椒的接口。抽象类的派生类是不同材质的面条。抽象面条类,包含了辣椒这个属性,所以面条实现了在辣椒这方面的维度的变化。但是面条又有不同的派生类,不同的派生类实现又代表了另一个维度的变化。所以再最后的面条实现类时,可以根据选择实现两个维度的变化。
Abstraction
定义抽象类的接口
维护一个指向Implementor类型对象的指针
RefinedAbstraction
扩充由Abstraction定义的接口
Implementor
定义实现类的接口,不一定要与Abstraction的接口完
全一致,甚至可以完全不同
ConcreteImplementor
实现Implementor接口并定义它的具体实现