定义
桥接模式是一种结构型设计模式,它的核心思想是将抽象部分与实现部分分离,使它们可以独立变化。
结构
- 抽象类(Abstraction):定义抽象接口,持有实现部分的引用。
- 具体抽象类(Refined Abstraction):扩展抽象接口。
- 实现类(Implementor):定义实现部分的接口,通常是一些基础操作。
- 具体实现类(Concrete Implementor):提供实现类接口的具体实现。
通常,抽象部分是面向高层业务逻辑的,而实现部分则关注底层细节。因此一般会将与业务方法关系更密切的维度设计为抽象部分。
应用场景
- 跨平台 GUI 组件:当 GUI 组件需要在多个操作系统上运行且渲染方式不同时,使用桥接模式解耦 UI 组件与平台渲染逻辑。
- 图形绘制引擎:当应用程序需要支持不同的图形绘制库(如 OpenGL、DirectX),使用桥接模式解耦图形形状与具体的绘制引擎。
优缺点
优点:
- 解耦抽象与实现,提高代码灵活性:使抽象部分和实现部分可以独立扩展,避免二者强耦合,提高系统的灵活性。
- 扩展性强,符合开闭原则:新增抽象部分或实现部分时,无需修改现有代码,只需添加新的具体抽象类或具体实现类即可,提高了系统的可扩展性,并且符合开闭原则。
- 减少子类数量:通过动态组合代替继承,降低类的数量,减少复杂度,提升可维护性。
缺点:
- 对客户端不够友好:客户端需要理解抽象部分与实现部分的组合方式,相比直接使用继承,增加了使用和理解的复杂度。
代码示例
from abc import ABC, abstractmethod
# 实现部分:消息发送方式(短信、邮件)
class MessageSender(ABC):
@abstractmethod
def send(self, message: str):
pass
class SMSMessageSender(MessageSender):
def send(self, message: str):
print(f"【短信发送】{message}")
class EmailMessageSender(MessageSender):
def send(self, message: str):
print(f"【邮件发送】{message}")
# 抽象部分:消息类型(普通消息、加急消息)
class Message(ABC):
def __init__(self, sender: MessageSender):
self.sender = sender # 通过组合方式使用消息发送方式
@abstractmethod
def send(self, content: str):
pass
class CommonMessage(Message):
def send(self, content: str):
print("【普通消息】处理中...")
self.sender.send(content)
class UrgentMessage(Message):
def send(self, content: str):
print("【加急消息】需要立即处理!")
self.sender.send(f"【加急】{content}")
# 客户端代码
if __name__ == "__main__":
# 选择短信方式发送普通消息
sms_sender = SMSMessageSender()
common_msg = CommonMessage(sms_sender)
common_msg.send("会议将在下午3点举行")
# 选择邮件方式发送加急消息
email_sender = EmailMessageSender()
urgent_msg = UrgentMessage(email_sender)
urgent_msg.send("服务器异常,请立即检查!")
参考
《设计模式的艺术》