定義
橋接模式是一種結構型設計模式,它的核心思想是將抽象部分與實現部分分離,使它們可以獨立變化。
結構
- 抽象類(Abstraction):定義抽象接口,持有實現部分的引用。
- 具體抽象類(Refined Abstraction):擴展抽象接口。
- 實現類(Implementor):定義實現部分的接口,通常是一些基礎操作。
- 具體實現類(Concrete Implementor):提供實現類接口的具體實現。
通常,抽象部分是面向高層業務邏輯的,而實現部分則關注底層細節。因此一般會將與業務方法關系更密切的維度設計為抽象部分。
應用場景
- 跨平臺 GUI 組件:當 GUI 組件需要在多個操作系統上運行且渲染方式不同時,使用橋接模式解耦 UI 組件與平臺渲染邏輯。
- 圖形繪制引擎:當應用程序需要支持不同的圖形繪制庫(如 OpenGL、DirectX),使用橋接模式解耦圖形形狀與具體的繪制引擎。
優缺點
優點:
- 解耦抽象與實現,提高代碼靈活性:使抽象部分和實現部分可以獨立擴展,避免二者強耦合,提高系統的靈活性。
- 擴展性強,符合開閉原則:新增抽象部分或實現部分時,無需修改現有代碼,只需添加新的具體抽象類或具體實現類即可,提高了系統的可擴展性,并且符合開閉原則。
- 減少子類數量:通過動態組合代替繼承,降低類的數量,減少復雜度,提升可維護性。
缺點:
- 對客戶端不夠友好:客戶端需要理解抽象部分與實現部分的組合方式,相比直接使用繼承,增加了使用和理解的復雜度。
代碼示例
from abc import ABC, abstractmethod# 實現部分:消息發送方式(短信、郵件)
class MessageSender(ABC):@abstractmethoddef send(self, message: str):passclass 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 # 通過組合方式使用消息發送方式@abstractmethoddef send(self, content: str):passclass 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("服務器異常,請立即檢查!")
參考
《設計模式的藝術》