目录

  1. 桥接模式简介
  2. 桥接模式的结构
  3. 桥接模式的优缺点
  4. 桥接模式的实现
    • 4.1 Python 示例
    • 4.2 与继承的区别
  5. 桥接模式的应用场景
  6. 出站链接
  7. 站内链接
  8. 参考资料

1. 桥接模式简介

桥接模式(Bridge Pattern) 是一种结构型设计模式,用于分离抽象部分与其实现部分,使它们可以独立变化

为什么使用桥接模式?

  • 减少子类数量,避免继承导致的类爆炸
  • 分离抽象与实现,提高代码扩展性。
  • 适用于多个维度变化的场景(如设备类型 + 绘制方式)。

典型应用

  • 图形绘制(形状 + 颜色)
  • 消息发送(消息类型 + 发送方式)
  • 数据库驱动(数据库类型 + 连接方式)

2. 桥接模式的结构

桥接模式主要包含以下四个角色

角色作用
Abstraction(抽象类)定义高层接口,持有实现部分的引用
Refined Abstraction(扩展抽象类)具体实现抽象接口,并委托实现类完成具体工作
Implementor(实现接口)定义实现类的行为接口
Concrete Implementor(具体实现类)具体实现 Implementor 接口

UML 类图

┌──────────────────────────┐
│      Abstraction         │  (抽象类)
│  - implementor: Implementor │
│  + operation()           │
└────────▲────────────────┘
         │
┌──────────────────────────┐
│  Refined Abstraction     │  (扩展抽象类)
│  + operation()           │
└────────▲────────────────┘
         │
┌──────────────────────────┐
│       Implementor        │  (实现接口)
│  + operation_impl()      │
└────────▲────────────────┘
         │
┌──────────────────────────┐
│  Concrete Implementor    │  (具体实现)
│  + operation_impl()      │
└──────────────────────────┘


3. 桥接模式的优缺点

优点

  1. 抽象与实现分离,两者可以独立变化。
  2. 减少子类数量,避免继承导致的类爆炸
  3. 符合开闭原则(OCP),方便扩展新功能。

缺点

  1. 增加代码复杂度,需要额外的抽象层。
  2. 难以理解,尤其对初学者而言。

4. 桥接模式的实现

4.1 Python 示例

场景:实现消息发送系统,支持 短消息(SMS)、邮件(Email) 发送方式,同时可以发送 普通消息、加急消息

# 1. 实现部分(Implementor)
class MessageSender:
    def send(self, message):
        pass

# 2. 具体实现类(Concrete Implementor)
class EmailSender(MessageSender):
    def send(self, message):
        print(f"Sending Email: {message}")

class SMSSender(MessageSender):
    def send(self, message):
        print(f"Sending SMS: {message}")

# 3. 抽象部分(Abstraction)
class Message:
    def __init__(self, sender: MessageSender):
        self.sender = sender

    def send_message(self, content):
        pass

# 4. 具体抽象类(Refined Abstraction)
class NormalMessage(Message):
    def send_message(self, content):
        print("[Normal]")
        self.sender.send(content)

class UrgentMessage(Message):
    def send_message(self, content):
        print("[Urgent]")
        self.sender.send(content)

# 5. 客户端代码
email_sender = EmailSender()
sms_sender = SMSSender()

normal_msg = NormalMessage(email_sender)
urgent_msg = UrgentMessage(sms_sender)

normal_msg.send_message("Hello, this is a normal email.")
urgent_msg.send_message("Warning! This is an urgent SMS.")

输出结果:

[Normal]
Sending Email: Hello, this is a normal email.
[Urgent]
Sending SMS: Warning! This is an urgent SMS.


4.2 桥接模式 vs 继承

不使用桥接模式(继承方式)

普通消息(邮件)
普通消息(短信)
加急消息(邮件)
加急消息(短信)

如果继续增加 消息类型(语音消息),就需要 6 个类

使用桥接模式

消息类型(普通、加急) × 发送方式(邮件、短信、语音)

只需 4 个类,避免类爆炸


5. 桥接模式的应用场景

适用于以下情况

  1. 对象具有两个独立变化的维度
    • 例如 设备(TV、Radio) + 遥控器(基本、智能)
  2. 需要减少子类数量
    • 例如 消息类型(普通、加急) × 发送方式(Email、SMS)
  3. 需要支持未来扩展
    • 例如 图形绘制(形状 + 颜色)。

真实案例

  • 前端开发
    • React/Vue 组件(<Button primary /> vs <Button secondary />)。
  • 数据库
    • 不同数据库 + 不同查询方式(MySQL + JDBC vs MongoDB + REST API)。
  • 设备与控制
    • 智能家居(智能灯泡 + 遥控器)。
  • 游戏开发
    • 角色技能(火焰攻击 + 近战武器 vs 冰霜攻击 + 远程武器)。

6. 出站链接

7. 站内链接

8. 参考资料

  • Gamma, E., Design Patterns: Elements of Reusable Object-Oriented Software (1994).
  • Martin, R. C., Clean Code: A Handbook of Agile Software Craftsmanship (2009).

总结

  • 桥接模式适用于多个维度变化的场景,如 形状 + 颜色、消息类型 + 发送方式
  • 它比继承更灵活,避免类爆炸,符合 开闭原则
  • 适用于 UI 组件、数据库、智能设备等应用场景

如果你有特定的应用需求,欢迎讨论!🚀