适配器模式、桥接模式、装饰器模式和观察者模式对比
适配器模式、桥接模式、装饰器模式和观察者模式对比
一核心思想对比
| 模式 | 核心思想 | 关键词 |
|---|---|---|
| 桥接模式 (Bridge) | 将抽象与实现分离,使两者可以独立变化 | 分离、解耦、两个维度 |
| 适配器模式 (Adapter) | 将一个类的接口转换成客户期望的另一个接口 | 转换、兼容、包装 |
| 装饰器模式 (Decorator) | 动态地给对象添加额外的职责 | 增强、扩展、递归包装 |
| 组合模式 (Composite) | 将对象组合成树形结构,统一处理单个对象和组合对象 | 树形、部分-整体、递归 |
基本结构对比
桥接模式
Abstraction ──组合──> Implementor
↑ ↑
RefinedAbstraction ConcreteImplementor
特点:两个独立的继承层次,通过组合连接
适配器模式
Client ──> Target
↑
Adapter ──组合/继承──> Adaptee
特点:单层包装,转换接口
装饰器模式
Component
↑
├─── ConcreteComponent
└─── Decorator ──组合──> Component
↑
ConcreteDecorator
特点:装饰器和被装饰对象实现相同接口,可递归嵌套
组合模式
Component
↑
├─── Leaf
└─── Composite ──组合──> Component (多个)
特点:树形结构,组合节点包含多个子节点
何时使用
桥接模式
- 有多个维度的变化(如:形状×颜色)
- 避免继承导致的类爆炸
- 需要在运行时切换实现
- 抽象和实现都需要独立扩展
适配器模式
- 需要使用现有类,但接口不符合需求
- 集成第三方库或遗留代码
- 让不相关的类协同工作
- 统一多个类的接口
装饰器模式
- 需要动态添加功能
- 需要多种功能的任意组合
- 不能通过继承扩展(如类是final的)
- 避免子类爆炸
组合模式
- 需要表示对象的部分-整体层次结构
- 希望统一处理单个对象和组合对象
- 需要树形结构(如文件系统、组织架构)
- 客户端不需要区分叶节点和组合节点
典型应用场景
| 模式 | 典型场景 |
|---|---|
| 桥接模式 | • 图形系统(形状 × 渲染引擎) • 跨平台应用(业务逻辑 × 平台API) • 数据库驱动(数据库 × 驱动类型) • 消息系统(消息类型 × 发送方式) |
| 适配器模式 | • 电源适配器(不同电压标准) • 数据格式转换(XML ↔ JSON) • 单位转换(摄氏度 ↔ 华氏度) • 旧系统集成(Legacy API → Modern Interface) |
| 装饰器模式 | • Java I/O流(BufferedReader, InputStreamReader) • 咖啡配料(Coffee + Milk + Sugar) • UI组件(Window + Border + Scrollbar) • 文本格式(Text + Bold + Italic) |
| 组合模式 | • 文件系统(File/Directory) • 图形编辑器(Shape/Group) • 组织架构(Employee/Department) • UI组件树(Widget/Container) |
优缺点总结
| 模式 | 主要优点 | 主要缺点 |
|---|---|---|
| 桥接模式 | • 分离抽象和实现 • 避免类爆炸 • 提高可扩展性 |
• 增加系统复杂度 • 需要正确识别两个维度 • 简单场景可能过度设计 |
| 适配器模式 | • 提高类复用性 • 让不兼容接口协作 • 符合开闭原则 |
• 增加系统复杂度 • 过多使用会使系统凌乱 • 有额外的间接调用开销 |
| 装饰器模式 | • 比继承更灵活 • 动态添加功能 • 可任意组合 |
• 多层装饰难以调试 • 产生很多小对象 • 访问具体类型成员困难 |
| 组合模式 | • 统一处理对象 • 简化客户端代码 • 易于添加新组件 |
• 难以限制组件类型 • 设计过于通用 • 递归调用可能影响性能 |
特征代码识别
桥接模式
class Abstraction {
std::shared_ptr<Implementor> impl; // ← 关键特征
void operation() { impl->operationImpl(); }
};
适配器模式
class Adapter : public Target {
std::shared_ptr<Adaptee> adaptee; // ← 关键特征
void request() { adaptee->specificRequest(); }
};
装饰器模式
class Decorator : public Component {
std::unique_ptr<Component> component; // ← 关键特征
void operation() { component->operation(); }
};
组合模式
class Composite : public Component {
std::vector<Component*> children; // ← 关键特征
void operation() {
for (auto c : children) c->operation();
}
};