适配器模式、桥接模式、装饰器模式和观察者模式对比

适配器模式、桥接模式、装饰器模式和观察者模式对比

一核心思想对比

模式 核心思想 关键词
桥接模式 (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();
    }
};