设计模式之桥接模式
引入
初始方案
场景一:
Sunny 软件公司欲开发一个跨平台图像浏览系统,要求该系统能够显示 BMP、JPG、GIF、PNG 等多种格式的文件,并且能够在Windows、Linux、Unix 等多个操作系统上运行。
系统首先将各种格式的文件解析为像素矩阵( Matrix ),然后将像素矩阵显示在屏幕上,在不同的操作系统中可以调用不同的绘制函数来绘制像素矩阵。
系统需具有较好的扩展性以支持新的文件格式和操作系统。
初始的设计方案如下:
这种设计方案解决的问题有:
- 将图片格式和操作系统解耦,将这两个维度分离,各自独立变化,进而对二者设计独立的继承等级结构,符合单一职责原则
- 摒弃多重继承,而使用关联关系(Image与ImageImp之间的关联),符合合成复用原则。
- 使用抽象类,符合里氏代换原则。
- 符合开闭原则。
- 使用抽象类,利用运行时多态,可以对子类做统一处理。
桥接模式
桥接模式:
将抽象部分和实现部分分离,使他们都可以独立的变化。
(通常情况下,我们将 具有两个变化维度的类的业务方法 和 与之关系最密切的维度 设计为 抽象类层次结构(抽象部分),而将另一个维度设计为 实现类层次结构(实现部分)
两个要点:
- 用 抽象关联(抽象类之间的关联关系) 取代 多继承
- 将类之间的 静态继承关系 转换为 动态的对象组合关系
设计结构图

其中:
- Abstraction 抽象类:定义一个Implementor类型的变量,实现与Implementor的抽象关联。抽象类中既可以包含抽象业务方法(abstract方法),也可以包含具体业务方法
- RefinedAbstraction(抽象类实体):实现了在Abstraction中的抽象方法,以及可以利用 Implementor变量调用Implementor中定义的业务方法
- Implementor 实现类接口:相当于实现部分的抽象类
- ConsreteImplementor 实现类实体:程序运行时,将替换父类,将自己的业务方法传递给抽象类实体
总结
桥接模式将实体的抽象部分和实现部分分离,使其独立变化。
满足:
- 单一职责原则
- 开闭原则
- 合成复用原则
- 里氏代换原则
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!