桥接与装饰者 Bridge and Decorator Patterns
桥接模式
- 模式动机
- 对于两个变化维度的系统,根据实际将两个变化维度进行组合,这样设计使系统中类的个数更少,且系统扩展更为方便
- 将继承关系转换为关联关系,从而降低了类与类之间的耦合,减少了代码编写量
- 模式定义
- 将抽象部分与它的实现部分分离,使它们都可以独立地变化
- 对象结构型模式
- 又称柄体模式或接口模式
- 模式结构
- Abstraction 抽象类
- RefinedAbstraction 扩充抽象类
- Implementor 实现类接口
- ConcreteImplementor 具体实现类

- 模式分析
- 重点是抽象化与实现化脱耦,使得两者可以独立地变化
- 抽象化
- 将对象的共同性质抽取出来形成类的过程
- 实现化
- 针对抽象化给出的具体实现
- 脱耦
- 将抽象化和实现化之间的耦合解脱开,或者说将它们之间的强关联改成弱关联,将两个角色之间的继承关系改为关联关系
- 抽象化
- 重点是抽象化与实现化脱耦,使得两者可以独立地变化
- 模式优缺点
- 优点
- 分离抽象接口及其实现部分
- 比多继承方案更好的解决方法
- 提高了系统的可扩充性
- 实现细节对客户透明,可以对用户隐藏实现细节
- 缺点
- 增加系统的理解与设计难度,聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程
- 桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围具有一定局限性
- 优点
- 模式适用环境
- 如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系
- 抽象化角色和实现化角色可以以继承的方式独立扩展而互不影响
- 一个类存在两个独立变化的我维度,且这两个维度都需要进行扩展
- 设计要求需要独立管理抽象化角色和具体化角色
- 不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统
- 模式应用
- java语言痛过java虚拟机实现平台的无关性(运行平台聚合于java应用程序)
- AWT中的Peer架构
- JDBC驱动程序动态地将一个特点类型的数据库和一个java应用程序绑定在一起
- 模式扩展
- 适配器模式与桥接模式的联用
- 桥接模式用于系统的初步设计,对于存在两个独立变化维度的类可以将其分为抽象化和实现化两个角色,使它们可以分别进行变化;而在初步设计完成之后,当发现系统与已有类无法协同工作时,可以采用适配器模式
- 有时候设计初期也需要考虑适配器模式,特别是那些涉及到大量第三方应用接口的情况
- 适配器模式与桥接模式的联用

装饰模式
- 模式动机
- 一般有两种方式可以实现给一个类或对象增加行为
- 继承机制
- 关联机制
- 以对客户透明的方式动态地给一个对象附加上更多的责任
- 在不需要创造更多子类的情况下,将对象的功能加以扩展
- 一般有两种方式可以实现给一个类或对象增加行为
- 模式定义
- 动态地给一个对象增加一些额外的职责
- 别名为包装器Wrapper
- 对象结构型模式
- 模式结构
- Component 抽象构件
- ConcreteComponent 具体构件
- Decorator 抽象装饰类
- ConcreteDecorator 具体装饰类

- 模式分析
- 与继承关系相比,关联关系的主要优势在于不会破坏类的封装性,而且继承是一种耦合度较大的静态关系,无法在程序运行时动态扩展
- 关联关系的缺点是比继承关系要创建更多对象
- 模式优缺点
- 优点
- 提供比继承更多的灵活性
- 通过一种动态的方式来扩展一个对象的功能,通过配置文件可以在运行时选择不同的装饰器,从而实现不同的行为
- 通过使用不同的具体装饰类以及这些装饰类的排列组合,可以创造出很多不同行为的组合
- 具体构件类与具体装饰类可以独立变化,用户可以根据需要增加新的构件类和具体装饰类,在使用时再对其进行组合,原由代码无须改变,符合开闭原则
- 缺点
- 使用装饰模式进行系统设计时将产生很多小对象,还将产生很多具体装饰类,增加系统复杂度,加大学习和理解的难度
- 装饰模式比继承更加容易出错,排错也很困难,对于多次装饰的对象,调试时寻找错误可能需要逐级排查,较为繁琐
- 优点
- 模式适用环境
- 不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责
- 动态地给一个对象增加/撤销功能
- 当不能采用继承的方式对系统进行扩充或者采用继承不利于系统扩展和维护时
- 系统中存在大量独立的扩展,为支持每一种组合将产生大量的子类
- 类定义不能继承(final 类)
- 模式应用
- Java IO
- 模式扩展
- 装饰模式的简化需要注意的问题
- 一个装饰类的接口必须与被装饰类的接口保持相同
- 不要把太多的逻辑和状态放在具体构件类中
- 如果只有一个具体构件类而没有抽象构件类,那么抽象装饰类可以作为具体构件类的直接子类
- 透明装饰模式
- 客户端完全针对抽象编程,装饰模式的透明性要求客户端程序不应该声明具体构件类型和具体装饰类型,而应该全部声明为抽象构件类型
- 半透明装饰模式
- 允许用户在客户端声明具体装饰者类型的对象,调用在具体装饰者类中新增的方法
英文补充 English Supplement
Bridge Pattern 桥接模式
英文定义:
Decouple an abstraction from its implementation so that the two can vary independently.
中文意思:
将抽象部分与它的实现部分解耦,使二者都可以独立变化。
别名:
Handle and Body
柄体模式
核心术语:
| English | 中文 | 说明 |
|---|---|---|
| Abstraction | 抽象类 / 抽象部分 | 定义高层抽象接口,维护 Implementor 引用 |
| RefinedAbstraction | 扩充抽象类 | 扩展 Abstraction |
| Implementor | 实现类接口 | 定义实现部分的接口 |
| ConcreteImplementor | 具体实现类 | 实现 Implementor 接口 |
| implementation | 实现部分 | 被 Abstraction 委派调用的部分 |
| decouple | 解耦 | 把强绑定改成弱关联 |
关键句:
Bridge replaces inheritance with composition/aggregation.
桥接模式用组合或聚合替代继承。
更准确地说,桥接模式把两个变化维度拆开:
abstraction hierarchy + implementation hierarchy
抽象层次 + 实现层次
例如:
Shape: Circle / Rectangle
Color: Red / Blue
如果用继承,可能变成 RedCircle、BlueCircle、RedRectangle、BlueRectangle。如果用桥接,就让 Shape 持有 Color,两个维度分别扩展。
考试表达:
- Bridge Pattern is useful when a class has two independent dimensions of variation.
- It avoids a permanent binding between an abstraction and its implementation.
- It improves extensibility but increases design complexity.
- It is usually considered at the initial design stage.
Bridge vs Adapter
| Pattern | 中文 | 使用时机 | 共同点 |
|---|---|---|---|
| Bridge | 桥接模式 | 系统设计初期,用来分离两个变化维度 | 都通过间接层降低耦合 |
| Adapter | 适配器模式 | 系统已有后,用来让不兼容接口一起工作 | 都可能包装另一个对象 |
一句话:
Bridge is designed up-front; Adapter is often applied afterwards.
桥接通常是预先设计的,适配器常常是事后补救的。
Decorator Pattern 装饰模式
英文定义:
Attach additional responsibilities to an object dynamically.
Decorators provide a flexible alternative to subclassing for extending functionality.
中文意思:
动态地给一个对象附加额外职责。装饰者为扩展功能提供了比子类化更加灵活的替代方案。
别名:
Wrapper
包装器
核心术语:
| English | 中文 | 说明 |
|---|---|---|
| Component | 抽象构件 | 被装饰对象和装饰者的公共接口 |
| ConcreteComponent | 具体构件 | 真正被装饰的原始对象 |
| Decorator | 抽象装饰类 | 持有 Component 引用 |
| ConcreteDecorator | 具体装饰类 | 添加额外职责 |
| responsibility | 职责 | 额外功能或行为 |
| dynamic extension | 动态扩展 | 运行时组合功能 |
关键句:
Decorator adds behavior to individual objects, not to an entire class.
装饰模式给单个对象添加行为,而不是给整个类添加行为。
装饰模式的基本结构:
Decorator implements/extends Component
Decorator has a Component
Decorator delegates calls to the wrapped Component
中文理解:
- 装饰者和被装饰者拥有相同接口
- 装饰者内部持有一个被装饰对象
- 调用装饰者方法时,通常先/后添加额外行为,再委派给被装饰对象
Transparent Decorator vs Semi-transparent Decorator
| Type | 中文 | 特点 |
|---|---|---|
| Transparent Decorator | 透明装饰模式 | 客户端全部声明为 Component 类型,不关心具体装饰类 |
| Semi-transparent Decorator | 半透明装饰模式 | 客户端可以声明具体装饰类,以调用新增方法 |
透明装饰更符合标准装饰模式,因为客户端完全针对抽象编程;半透明装饰可以使用新增行为,但会增加客户端对具体装饰类的依赖。
Decorator vs Inheritance
| Aspect | Inheritance 继承 | Decorator 装饰 |
|---|---|---|
| Binding time | 编译时静态决定 | 运行时动态组合 |
| Scope | 影响整个类 | 影响单个对象 |
| Flexibility | 组合爆炸时不灵活 | 可以自由叠加装饰 |
| Cost | 类结构可能膨胀 | 小对象数量可能增加 |
考试表达:
- Decorator Pattern follows the Open-Closed Principle.
- It allows responsibilities to be added and removed dynamically.
- It is more flexible than inheritance, but may create many small objects.
- Java I/O is a classic example of Decorator Pattern.
Bridge 和 Decorator 快速区分
| Pattern | 核心目的 | 关键词 |
|---|---|---|
| Bridge | 分离抽象和实现,让两个维度独立变化 | decouple abstraction and implementation |
| Decorator | 动态给对象添加额外职责 | attach responsibilities dynamically |
高频英文术语 Glossary
| English Term | 中文 |
|---|---|
| Bridge Pattern | 桥接模式 |
| Decorator Pattern | 装饰模式 |
| abstraction | 抽象部分 |
| implementation | 实现部分 |
| decouple | 解耦 |
| vary independently | 独立变化 |
| Abstraction | 抽象类 |
| RefinedAbstraction | 扩充抽象类 |
| Implementor | 实现类接口 |
| ConcreteImplementor | 具体实现类 |
| aggregation | 聚合 |
| composition | 组合 |
| two dimensions of variation | 两个变化维度 |
| Wrapper | 包装器 |
| Component | 抽象构件 |
| ConcreteComponent | 具体构件 |
| Decorator | 抽象装饰类 |
| ConcreteDecorator | 具体装饰类 |
| responsibility | 职责 |
| dynamic extension | 动态扩展 |
| transparent decorator | 透明装饰 |
| semi-transparent decorator | 半透明装饰 |
| subclassing | 子类化 / 继承扩展 |