在开始学java的时候老师讲到继承的时候,总是喜欢用一个例子来讲解,那就是画图,这里有一个画笔,可以画正方形、长方形、圆形(这个大家都知道怎么做吧,我就不解释了)。但是现在我们需要给这些形状进行上色,这里有三种颜色:白色、灰色、黑色。这里我们可以画出3*3=9中图形:白色正方形、白色长方形、白色圆形。。。。。。到这里了我们几乎到知道了这里存在两种解决方案:
- 方案一:为每种形状都提供各种颜色的版本。
- 方案二:根据实际需要对颜色和形状进行组合。
我们我们采用方案一来实现的话,我们是不是也可以这样来理解呢?为每种颜色都提供各种形状的版本呢?这个是完全的可以的。如下:
对于中两个图形,我们都会很清楚这样一个问题:加入我们添加椭圆,我们是不是又要增加三种颜色呢?假如我们在增加一个绿色,我们就要增加其四种形状了,继续加。继续加……每次增加都会增加若干个类(如果增加颜色则会增加形状个数个类,若增加形状则会增加颜色个数个类),这样的情况我想每个程序员都不会想要吧!那么我们看方案二。 方案二所提供的就是解决方法是:提供两个父类一个是颜色、一个形状,颜色父类和形状父类两个类都包含了相应的子类,然后根据需要对颜色和形状进行组合。
对于有几个变化的维度,我们一般采用方案二来实现,这样除了减少系统中的类个数,也利于系统扩展。对于方案二的应用我们称之为桥接模式。
一.桥接模式特点
将抽象部分与实现部分分离,使他们都可以独立地进行变化。为了达到让抽象部分和实现部分独立变化的目的,抽象部分会拥有实现部分的接口对象,有了实现部分的接口对象之后,就能够通过这个接口来调用具体实现部分的功能。桥接在程序上就体现成了抽象部分拥有实现部分的接口对象,维护桥接就是维护这个关系,也就是说,桥接模式中的桥接是一个单方向的关系,只能够抽象部分去使用实现部分的对象,而不能反过来。
桥接模式将继承关系转化成关联关系,它降低了类与类之间的耦合度,减少了系统中类的数量,也减少了代码量。抽象部分就是指未使用桥接模式中的父类,实现部分就是所有的子类。(如图一,涂好各种颜色的各种图形是实现部分(最下面),上面的图形和他的子类各种图形就是抽象部分(第一二两层),将这两部分解耦合,可以各自独立的变化)
二. 模式优缺点
优点
- 1、分离抽象接口及其实现部分。提高了比继承更好的解决方案。
- 2、桥接模式提高了系统的可扩充性,在两个变化维度中任意扩展一个维度,都不需要修改原有系统。
- 3、实现细节对客户透明,可以对用户隐藏实现细节。
缺点
- 1、桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。
- 2、桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围具有一定的局限性。
三. 模式使用场景
- 1、如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。
- 2、对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。
- 3、一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。
四.模式总结
- 1、桥接模式实现了抽象化与实现化的脱耦。他们两个互相独立,不会影响到对方。
- 2、对于两个独立变化的维度,使用桥接模式再适合不过了。
- 3、对于"具体的抽象类"所做的改变,是不会影响到客户。