目录
- 桥接模式简介
- 桥接模式的结构
- 桥接模式的优缺点
- 桥接模式的实现
- 4.1 Python 示例
- 4.2 与继承的区别
- 桥接模式的应用场景
- 出站链接
- 站内链接
- 参考资料
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. 桥接模式的优缺点
✅ 优点
- 抽象与实现分离,两者可以独立变化。
- 减少子类数量,避免继承导致的类爆炸。
- 符合开闭原则(OCP),方便扩展新功能。
❌ 缺点
- 增加代码复杂度,需要额外的抽象层。
- 难以理解,尤其对初学者而言。
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. 桥接模式的应用场景
适用于以下情况
- 对象具有两个独立变化的维度
- 例如 设备(TV、Radio) + 遥控器(基本、智能)。
- 需要减少子类数量
- 例如 消息类型(普通、加急) × 发送方式(Email、SMS)。
- 需要支持未来扩展
- 例如 图形绘制(形状 + 颜色)。
真实案例
- 前端开发
- React/Vue 组件(
<Button primary />
vs<Button secondary />
)。
- React/Vue 组件(
- 数据库
- 不同数据库 + 不同查询方式(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 组件、数据库、智能设备等应用场景。
如果你有特定的应用需求,欢迎讨论!🚀
发表回复