简介
桥接模式(Bridge Pattern):将抽象部分和实现部分解耦,使两者能够独立变化。
- 如果某个类存在两个个独立变化的维度,使用桥接可以将传统的多层继承转化为抽象关联,解耦两个维度的变化,使得系统可以任意扩充一个维度而不影响另一个维度。
- 关联关系作为连接两个维度的桥。
结构和实现
- 角色包括:
- 抽象类:抽象部分的抽象类,包含抽象类业务方法,关联实现类对象。
- 扩充抽象类:实现抽象类中的业务方法,并调用实现类的业务方法。
- 实现类接口:提供实现类的业务方法声明,是抽象类中的引用类型。
- 具体实现类:实现实现类接口。
- 桥接模式结构。
- 客户端根据配置文件决定具体使用哪一个扩充抽象类,并注入哪一个具体实现类。无需修改源码,符合开闭原则。
实例
- 开发跨平台的图片浏览系统,需要显示BMP,JPG,GIF,PNG等格式文件,并在Windows,Linux,Unix等操作系统上运行。系统需要先解析不同格式的文件为像素矩阵,再调用不同操作系统的绘制函数根据像素矩阵绘图。
桥接模式结合适配器模式
- 桥接模式通常用于初步设计阶段,将两个独立维度的变化转化为抽象化和实例化两个角色。
- 适配器模式通常用于初步设计完成后,协调系统和不兼容的已有类。
- 如果需要设计大量的第三方应用,需要一开始就考虑适配器模式。
- 报表处理系统中需要分开报表显示和数据输出,有多种数据输出方式和报表显示方式。显示报表和输出数据可用桥接模式,输出到excel需要使用适配器模式调用excel api。
优缺点和适用环境
- 优点:
- 分离抽象部分和实现部分。可以通过增加抽象类和实现类接口的子类,使得不同维度可以自由地、不影响的变化,提高扩展性,符合开闭原则。
- 取代多继承。多继承违背单一职责原则,复用性差,类的数量多。
- 缺点:
- 增加系统复杂度。设计较难,需要系统针对抽象层设计编程。
- 识别独立维度难。使用受限。
- 使用范围:
- 需要在抽象化和具体化之间增加灵活性,使用关联代替继承。
- 系统需要在运行时组合抽象化对象和具体化对象。
- 一个类存在两个以上独立的维度,且需要独立扩展。
- 继承导致类的数量过多。
jdk中的应用
- java.util.logging中的Handler和Formatter。Handler作为抽象类,Formatter作为实现类接口。
- 在Handler中维持一个Formatter的引用,并在publish方法中调用Formatter的format方法。