0x01 背景
当一个类存在一个(或多个)变化的维度时,如果采用继承的方式来定义不同的实现,会导致实现类数量呈指数爆炸,比如对于画布来说,形状上有三种:正方形、长方形、圆形,颜色上有三种颜色:红色,蓝色、绿色。一共有3 * 3 =9种画布,如果采用继承的方式来实现具体的画布类,则有9种画布类,而且每添加一种形状(如椭圆)画布,需要实现所有颜色的椭圆形画布类,类似的每添加一种颜色,就需要实现该颜色的所有形状的画布类,这样会导致类个数的指数爆炸。桥接模式就是为了这样的问题。
0x02 桥接模式
- 将抽象和实现解耦,让他们可以独立变化
- 一个类存在两个(或多个)独立变化的维度,我们可以通过组合的方式,让这两个(或多个)维度可以独立进行扩展
- 通过组合关系代替继承关系,避免继承层次的指数级爆炸。
桥接模式遵循“组合优于继承”的设计原则
2.1 桥接模式的UML类图
桥接模式将形状和颜色这两个不同的变化维度拆分开:AbstractShap(抽象类)和Color(接口),让这两种维度独立变化,然后通过组合的方式将这两种维度组合在一起,所以最终类的个数只有:形状个数 + 颜色个数。
2.2 桥接模式的应用场景
当一个类存在两个(或多个)独立变化的维度时,可以将两个(或多个)维度拆分开独立变化,然后通过组合的方式进行扩展。