Python設計模式 - 適配器模式

定義

適配器模式(Adapter Pattern)是一種結構型設計模式,它用于將一個類的接口轉換為客戶端所期待的另一個接口。
注:在適配器模式定義中所提及的接口是指廣義的接口,它可以表示一個方法或者一組方法的集合。

結構

適配器模式可分為對象適配器模式和類適配器模式兩種。在對象適配器模式中,適配器與適配者之間是關聯關系;在類適配器模式中,適配器與適配者之間是繼承關系。

對象適配器模式:
在這里插入圖片描述

類適配器模式:
在這里插入圖片描述

  • 目標抽象類(Target): 客戶端希望使用的抽象類。
  • 適配者類(Adaptee): 需要適配的具體類。
  • 適配器類(Adapter): 作為一個轉換器,對Adaptee和Target進行適配。

應用場景

  1. 復用現有代碼:當你有現有的第三方庫或遺留代碼,這些代碼與新的系統接口不兼容時,使用適配器模式可以使它們能夠共同工作,而無需修改現有的代碼。例如,舊的數據庫訪問類或舊的消息隊列系統,通過適配器模式將它們與新的系統進行兼容。
  2. 多種外部系統對接:在系統需要與多個外部系統進行對接時,不同的外部系統可能會有不同的接口和協議。適配器模式可以幫助將這些不同的接口轉換為統一的接口,從而簡化集成工作。比如,可以將不同支付網關(如支付寶、微信支付、PayPal等)整合到統一的支付接口中,或將不同操作系統上的圖像處理庫通過適配器封裝為統一接口。
  3. 當系統或接口升級時,新接口可能與舊系統不兼容。適配器模式可以將新接口轉換為舊接口的形式,確保舊系統正常運行,無需大規模修改代碼。例如,第三方API更新時,適配器可以將新接口轉化為舊的調用方式,從而保持兼容性。

優缺點

優點:

  1. 解耦:適配器模式使得客戶端和具體的實現類解耦。客戶端只與適配器交互,而不直接依賴于具體的類實現,這樣客戶端無需關心具體實現的細節。
  2. 代碼復用性高:通過使用適配器,可以將舊的或第三方的代碼與新的系統無縫對接,避免重復開發。
  3. 易于擴展:通過引入新的適配器類,可以快速支持新的接口或協議,而不需要修改現有的代碼。

缺點:

  1. 增加系統復雜性:適配器模式通過引入額外的適配器類來實現接口轉換,這會使系統的結構更加復雜。在需要多個適配器時,會增加類的數量和相互關系,特別是當適配器層次過多時,可能會導致系統的維護變得更加困難。

代碼示例

對象適配器模式

# 目標抽象類
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元,通過微信支付

對象適配器模式和類適配器模式的比較

  1. 在類適配器模式中,由于適配器類是適配者類的子類,因此可以在適配器類中重寫一些適配者的方法,使得適配器的靈活性更強。而在對象適配器模式中,適配器通過組合適配者類實現功能,要修改適配者的方法則需要通過委托和包裝,操作上相對復雜。
  2. 在對象適配器模式中,一個對象適配器可以把多個不同的適配者適配到同一個目標。而在類適配器模式中,雖然可以通過繼承多個適配者來實現,但這樣會使類結構變得更加復雜,難以維護。
  3. 對象適配器模式 更適合需要高靈活性、能夠適配多個不同對象或者無需修改適配者的場景。類適配器模式 適用于適配單一適配者并且對性能和實現簡單性有較高要求的場景。

參考

《設計模式的藝術》

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/73072.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/73072.shtml
英文地址,請注明出處:http://en.pswp.cn/web/73072.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【前端工程化】

目錄 前端工程戶核心技術之模塊化前端模塊化的進化過程commonjs規范介紹commonjs規范示例commonjs模塊打包 amd規范、cmd規范前端工程化關鍵技術之npmwebpack原理 前端工程戶核心技術之模塊化 前端模塊化是一種標準,不是實現。commonjs是前端模塊化的標準&#xff…

關于CNN,RNN,GAN,GNN,DQN,Transformer,LSTM,DBN你了解多少

以下是神經網絡中常見的幾種模型的簡要介紹: 1. ?CNN (Convolutional Neural Network, 卷積神經網絡) ?用途: 主要用于圖像處理和計算機視覺任務。?特點: 通過卷積核提取局部特征,具有平移不變性,能夠有效處理高維數據(如圖像…

T113-i開發板的休眠與RTC定時喚醒指南

??在嵌入式系統設計中,休眠與喚醒技術是優化電源管理、延長設備續航的關鍵。飛凌嵌入式基于全志T113-i處理器開發設計的OK113i-S開發板提供了兩種休眠模式:freeze和mem,以滿足不同應用場景下的功耗與恢復速度需求。本文將詳細介紹如何讓OK1…

SpringBoot項目實戰(初級)

目錄 一、數據庫搭建 二、代碼開發 1.pom.xml 2.thymeleaf模塊處理的配置類 3.application配置文件 4.配置(在啟動類中) 5.編寫數據層 ②編寫dao層 ③編寫service層 接口 實現類 注意 補充(注入的3個注解) 1.AutoWir…

高性能網絡SIG雙月動態:加速 SMC eBPF 透明替換特性上游化進程,并與上游深度研討新特性

01、整體進展 本次雙月報總結了 SIG 在 1 月和 2 月的工作進展,工作聚焦在 ANCK CVE 和穩定性問題修復,以及上游 SMC eBPF 透明替換特性推進和多個話題討論上。 本月關鍵進展: 1. 推進 SMC eBPF 透明替換特性上游化,更新至 V7&…

某視頻的解密下載

下面講一下怎么爬取視頻,這個還是比小白的稍微有一點繞的 首先打開網址:aHR0cDovL3d3dy5wZWFydmlkZW8uY29tL3BvcHVsYXJfNA 首頁 看一下: 有一個標題和一個href,href只是一個片段,待會肯定要拼接, 先找一…

C++繼承機制:從基礎到避坑詳細解說

目錄 1.繼承的概念及定義 1.1繼承的概念 1.2 繼承定義 1.2.1定義格式 1.2.2繼承關系和訪問限定符 1.2.3繼承基類成員訪問方式的變化 總結: 2.基類和派生類對象賦值轉換 3.繼承中的作用域 4.派生類的默認成員函數 ?編輯 默認構造與傳參構造 拷貝構造&am…

測試基礎入門

文章目錄 軟件測試基礎1.1軟件測試概述什么是軟件測試什么是軟件需求說明書軟件測試的原則測試用例的設計測試用例設計的基本原則軟件測試分類軟件缺陷的定義 2.1軟件開發模型軟件開發模型概述大爆炸模型(邊寫邊改)軟件開發生命周期模型--螺旋模型軟件開…

022-spdlog

spdlog 以下是從原理到代碼實現的全方位spdlog技術調研結果,結合核心架構、優化策略和完整代碼示例: 一、核心架構設計原理 spdlog三級架構 (圖示說明:spdlog采用三級結構實現日志系統解耦) Registry管理中樞 全局…

STM32時鐘樹

時鐘樹 時鐘樹就是STM32中用來產生和配置時鐘,并且把配置好的時鐘發送到各個外設的系統,時鐘是所有外設運行的基礎,所以時鐘也是最先需要配置的東西,在程序中主函數之前還會執行一個SystemClock_Config()函數,這個函數…

【第22節】windows網絡編程模型(WSAAsyncSelect模型)

目錄 引言 一、WSAAsyncSelect模型概述 二、WSAAsyncSelect模型流程 2.1 自定義消息 2.2 創建窗口例程 2.3 初始化套接字 2.4 注冊網絡事件 2.5 綁定和監聽 2.6 消息循環 三、完整示例代碼 引言 在網絡編程的廣袤天地中,高效處理網絡事件是構建穩定應用的…

利用Dify編制用戶問題意圖識別和規范化回復

繼上一篇文章,成功完成Dify本地部署后,主要做了一些workflow和Agent的應用實現,整體感覺dify在工作流可視化編排方面非常好,即使部分功能無法實現,也可以通過代碼執行模塊或者自定義工具來實現(后續再具體分…

雙核鎖步技術在汽車芯片軟錯誤防護中的應用詳解

摘要 本文深入探討了雙核鎖步技術在保障汽車芯片安全性中的應用。文章首先分析了國產車規芯片在高安全可靠領域面臨的軟錯誤難點及攻克方向,然后詳細介紹了雙核鎖步技術的基本原理及其在汽車芯片防軟錯誤的重要性。通過對比國內外多家廠商的芯片技術,分析…

Lustre 語言的 Rust 生成相關的工作

目前 Lustre V6 編譯器支持編譯生成的語言為C語言。但也注意到,以 Rust 語言為生成目標語言,也存在若干相關工作。 rustre(elegaanz) 該項工作為 Lustre v6 語言的解析器,使用 Rust 語言實現。生成 Lustre AST。 項…

Java 之「單調棧」:從入門到實戰

Java 單調棧:從入門到實戰 文章目錄 Java 單調棧:從入門到實戰引言什么是單調棧?單調遞增棧單調遞減棧 單調棧的應用場景Java 實現單調棧代碼示例:下一個更大元素代碼解析 單調棧的優勢實戰應用:股票價格跨度代碼示例代…

【Golang】defer與recover的組合使用

在Go語言中,defer和recover是兩個關鍵特性,通常結合使用以處理資源管理和異常恢復。以下是它們的核心應用場景及使用示例: 1. defer 的應用場景 defer用于延遲執行函數調用,確保在函數退出前執行特定操作。主要用途包括&#xff…

CSS 中flex - grow、flex - shrink和flex - basis屬性的含義及它們在彈性盒布局中的協同作用。

大白話CSS 中flex - grow、flex - shrink和flex - basis屬性的含義及它們在彈性盒布局中的協同作用。 在 CSS 的彈性盒布局(Flexbox)里,flex-grow、flex-shrink 和 flex-basis 這三個屬性對彈性元素的尺寸和伸縮性起著關鍵作用。下面為你詳細…

OpenGL ES ->乒乓緩沖,計算只用兩個幀緩沖對象(Frame Buffer Object)+疊加多個濾鏡作用后的Bitmap

乒乓緩沖核心思想 不使用乒乓緩沖,如果要每個濾鏡作用下的繪制內容,也就是這個濾鏡作用下的幀緩沖,需要創建一個Frame Buffer Object加上對應的Frame Buffer Object Texture使用乒乓緩沖,只用兩個Frame Buffer Object加上對應的F…

【HarmonyOS NEXT】關鍵資產存儲開發案例

在 iOS 開發中 Keychain 是一個非常安全的存儲系統,用于保存敏感信息,如密碼、證書、密鑰等。與文件系統不同,Keychain 提供了更高的安全性,因為它對數據進行了加密,并且只有經過授權的應用程序才能訪問存儲的數據。那…

ccfcsp1901線性分類器

//線性分類器 #include<iostream> using namespace std; int main(){int n,m;cin>>n>>m;int x[1000],y[1000];char z[1000];for(int i0;i<n;i){cin>>x[i]>>y[i];cin>>z[i];}int a[20],b[20],c[20];for(int i0;i<m;i){cin>>a[i…