定义
将抽象与实现分离,使它们可以独立变化。它是用组合(或聚合)关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。
优点:
- 由于抽象与实现分离,所以扩展能力强;
- 其实现细节对客户透明。
缺点:由于聚合关系建立在抽象层,要求开发者针对抽象化进行设计与编程,这增加了系统的理解与设计难度。
模式结构:
- 抽象化(Abstraction)角色:定义抽象类,并包含一个对实现化对象的引用。
- 扩展抽象化(Refined Abstraction)角色:是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法。
- 实现化(Implementor)角色:定义实现化角色的接口,供扩展抽象化角色调用。
- 具体实现化(Concrete Implementor)角色:给出实现化角色接口的具体实现。
- 桥接模式中有两个继承体系,分别称为“抽象”和“实现”;
- 抽象类中持有实现类的引用,并且含有set函数用于给用户设置这个抽象类的实现;
- 当给抽象类的对象设置完实现类对象之后,用户就可以通过抽象类的对象访问实现类对象中的函数及变量了。
实际问题:
请用继承体系表示以下事例:
老式手机由于操作系统不一致,因此不同厂家在生产完手机之后还得为该手机定制软件,也就是每个厂家生产的软件不能跨平台使用。
类图如下所示:
这种继承体系存在弊端:
此时如果要增加一种手机品牌,就还要为该品牌增加所有的软件类;
如果还要增加一种软件,就需要为所有品牌的手机增加新的软件类;
也就是说,目前这个继承体系的类分为两种类型,一种是手机品牌类,一种是手机软件类;不管增加哪种类型的类,都会导致要同时增加多个类,这样下去会导致继承体系过于庞大。
出现这种弊端的根本原因如下:
多种类别的类都存在于一个继承体系中,这样就会导致当增加一种功能时会相应增加多个类,而且有许多类之间功能大都相似。
解决办法:
将一个继承体系中的多种类型的类分成单独的继承体系,然后使用聚合/组合将这两个继承体系连接在一起。
这样当需要增加类时,由于新的类属于一个单独的继承体系,因此只需要在某一个继承体系中增加一个子类即可,从而避免了继承体系过于庞大的问题。
而这种将一个继承体系分成两个用组合/聚合方式连接的继承体系的方式就称为“合成/聚合复用原则”。
此时,如果需要增加一个类,只需要在一个继承体系中增加一个子类即可,无需增加好多类,从而继承体系不会异常庞大。
参考:
(1)三分钟理解“桥接模式”——设计模式轻松掌握 https://blog.csdn.net/u010425776/article/details/48242337
(2)桥接模式(Bridge模式)详解 http://c.biancheng.net/view/1364.html