定義
適配器模式(Adapter Pattern)是一種結構型設計模式,它用于將一個類的接口轉換為客戶端所期待的另一個接口。
注:在適配器模式定義中所提及的接口是指廣義的接口,它可以表示一個方法或者一組方法的集合。
結構
適配器模式可分為對象適配器模式和類適配器模式兩種。在對象適配器模式中,適配器與適配者之間是關聯關系;在類適配器模式中,適配器與適配者之間是繼承關系。
對象適配器模式:
類適配器模式:
- 目標抽象類(Target): 客戶端希望使用的抽象類。
- 適配者類(Adaptee): 需要適配的具體類。
- 適配器類(Adapter): 作為一個轉換器,對Adaptee和Target進行適配。
應用場景
- 復用現有代碼:當你有現有的第三方庫或遺留代碼,這些代碼與新的系統接口不兼容時,使用適配器模式可以使它們能夠共同工作,而無需修改現有的代碼。例如,舊的數據庫訪問類或舊的消息隊列系統,通過適配器模式將它們與新的系統進行兼容。
- 多種外部系統對接:在系統需要與多個外部系統進行對接時,不同的外部系統可能會有不同的接口和協議。適配器模式可以幫助將這些不同的接口轉換為統一的接口,從而簡化集成工作。比如,可以將不同支付網關(如支付寶、微信支付、PayPal等)整合到統一的支付接口中,或將不同操作系統上的圖像處理庫通過適配器封裝為統一接口。
- 當系統或接口升級時,新接口可能與舊系統不兼容。適配器模式可以將新接口轉換為舊接口的形式,確保舊系統正常運行,無需大規模修改代碼。例如,第三方API更新時,適配器可以將新接口轉化為舊的調用方式,從而保持兼容性。
優缺點
優點:
- 解耦:適配器模式使得客戶端和具體的實現類解耦。客戶端只與適配器交互,而不直接依賴于具體的類實現,這樣客戶端無需關心具體實現的細節。
- 代碼復用性高:通過使用適配器,可以將舊的或第三方的代碼與新的系統無縫對接,避免重復開發。
- 易于擴展:通過引入新的適配器類,可以快速支持新的接口或協議,而不需要修改現有的代碼。
缺點:
- 增加系統復雜性:適配器模式通過引入額外的適配器類來實現接口轉換,這會使系統的結構更加復雜。在需要多個適配器時,會增加類的數量和相互關系,特別是當適配器層次過多時,可能會導致系統的維護變得更加困難。
代碼示例
對象適配器模式
# 目標抽象類
class Payment:def pay(self, amount):pass# 支付寶支付類
class Alipay:def alipay_payment(self, amount):print(f"支付{amount}元,通過支付寶完成支付。")# 微信支付類
class WeChatPay:def wechat_payment(self, amount):print(f"支付{amount}元,通過微信支付完成支付。")# 支付寶適配器類
class AlipayAdapter(Payment):def __init__(self):self.alipay = Alipay()def pay(self, amount):self.alipay.alipay_payment(amount)# 微信支付適配器類
class WeChatPayAdapter(Payment):def __init__(self):self.wechat_pay = WeChatPay()def pay(self, amount):self.wechat_pay.wechat_payment(amount)# 客戶端通過適配器來選擇支付方式
alipay_adapter = AlipayAdapter()
wechat_adapter = WeChatPayAdapter()alipay_adapter.pay(100) # 支付100元,通過支付寶
wechat_adapter.pay(200) # 支付200元,通過微信支付
類適配器模式
# 支付寶適配器類(類適配器)
class AlipayAdapter(Alipay, Payment):def pay(self, amount):# 調用Alipay類的支付方法self.alipay_payment(amount)# 微信支付適配器類(類適配器)
class WeChatPayAdapter(WeChatPay, Payment):def pay(self, amount):# 調用WeChatPay類的支付方法self.wechat_payment(amount)# 客戶端通過適配器來選擇支付方式
alipay_adapter = AlipayAdapter()
wechat_adapter = WeChatPayAdapter()alipay_adapter.pay(100) # 支付100元,通過支付寶
wechat_adapter.pay(200) # 支付200元,通過微信支付
對象適配器模式和類適配器模式的比較
- 在類適配器模式中,由于適配器類是適配者類的子類,因此可以在適配器類中重寫一些適配者的方法,使得適配器的靈活性更強。而在對象適配器模式中,適配器通過組合適配者類實現功能,要修改適配者的方法則需要通過委托和包裝,操作上相對復雜。
- 在對象適配器模式中,一個對象適配器可以把多個不同的適配者適配到同一個目標。而在類適配器模式中,雖然可以通過繼承多個適配者來實現,但這樣會使類結構變得更加復雜,難以維護。
- 對象適配器模式 更適合需要高靈活性、能夠適配多個不同對象或者無需修改適配者的場景。類適配器模式 適用于適配單一適配者并且對性能和實現簡單性有較高要求的場景。
參考
《設計模式的藝術》