在讲桥接模式之前,先问一个问题:
如果一个类有两个变化维度,你会怎么设计?
很多人第一反应是 —— 继承。
但当继承层级开始“爆炸”时,桥接模式就该登场了。
一、桥接模式解决什么问题?
一句话:
将抽象部分与实现部分分离,使它们可以独立变化。
关键词:
- 抽象(Abstraction)
- 实现(Implementation)
- 解耦
- 组合替代继承
二、一个典型的继承爆炸问题
假设我们要设计一个“消息通知系统”。
消息类型有:
- 普通消息
- 紧急消息
发送渠道有:
- 邮件
- 短信
- 微信
很多人会这样写:
class EmailNormalMessage:
pass
class EmailUrgentMessage:
pass
class SMSNormalMessage:
pass
class SMSUrgentMessage:
pass
class WechatNormalMessage:
pass
class WechatUrgentMessage:
pass
问题来了:
如果再加一个“企业钉钉”渠道?
类数量继续翻倍。
这叫:
维度交叉导致类爆炸。
三、桥接模式的核心思想
不要让两个维度用继承耦合在一起。
而是:
- 一个维度负责“抽象”
- 一个维度负责“实现”
- 两者通过组合连接
结构是这样的:
Abstraction ---> Implementor
不是继承,而是“桥接”。
四、使用桥接模式重构示例
第一步:定义“实现部分”
class MessageSender:
def send(self, content):
raise NotImplementedError
具体实现:
class EmailSender(MessageSender):
def send(self, content):
print(f"发送邮件: {content}")
class SMSSender(MessageSender):
def send(self, content):
print(f"发送短信: {content}")
class WechatSender(MessageSender):
def send(self, content):
print(f"发送微信: {content}")
第二步:定义“抽象部分”
class Message:
def __init__(self, sender: MessageSender):
self.sender = sender
def send(self, content):
self.sender.send(content)
第三步:扩展抽象维度
class UrgentMessage(Message):
def send(self, content):
content = "[紧急] " + content
self.sender.send(content)
使用方式
email_sender = EmailSender()
sms_sender = SMSSender()
normal_msg = Message(email_sender)
normal_msg.send("系统通知")
urgent_msg = UrgentMessage(sms_sender)
urgent_msg.send("服务器故障")
现在:
- 新增渠道? → 新增 Sender 类
- 新增消息类型? → 新增 Message 子类
两条维度完全独立。
五、桥接模式的本质
桥接模式的真正核心是:
用组合替代多维继承。
它解决的是:
- 类数量指数级增长
- 继承层级过深
- 不易扩展
六、桥接 vs 策略模式
很多人会混淆。
表面结构很像。
区别在于:
| 对比点 | 桥接模式 | 策略模式 |
|---|---|---|
| 关注点 | 多维变化解耦 | 算法可替换 |
| 是否强调抽象层次 | 是 | 否 |
| 是否解决继承爆炸 | 是 | 否 |
一句话区分:
策略是“换算法”,
桥接是“拆维度”。
七、桥接模式在真实项目中的应用
非常常见于:
- UI 框架(不同平台渲染)
- 消息系统(类型 × 渠道)
- 支付系统(支付方式 × 支付渠道)
- 报表系统(报表类型 × 输出格式)
例如:
- 报表类型:财务、库存
- 输出格式:PDF、Excel、HTML
如果不用桥接,类会非常多。
八、什么时候不要用桥接?
不要为了“设计模式而设计模式”。
如果:
- 只有一个维度
- 或两个维度都不会扩展
桥接只会增加复杂度。
经验原则:
维度稳定时,用简单设计;
维度会扩展时,用桥接。
九、桥接模式优缺点
✅ 优点
- 避免类爆炸
- 提高扩展性
- 符合开闭原则
- 结构更清晰
❌ 缺点
- 增加系统抽象层
- 初期理解成本高
- 设计不当会变复杂
十、一句话总结
桥接模式的核心是“拆维度”。
当你发现:
- 类数量呈乘法增长
- 继承结构越来越难维护
就应该考虑:
用组合建立一座“桥”。
1538


&spm=1001.2101.3001.11974&articleId=158459717&d=1&t=3&u=ae564004b35444e691bd988d3f6120e6)

被折叠的 条评论
为什么被折叠?



