設計模式-結構型-適配器模式

在軟件開發中,隨著系統的不斷擴展和模塊的不斷增加,往往會遇到不同模塊之間接口不兼容的情況。此時,如果我們能通過某種方式將一個接口轉化為另一個接口,那么開發工作將變得更加靈活和高效。適配器模式(Adapter Pattern)正是為了解決這個問題而設計的,它能夠讓兩個不兼容的接口能夠協同工作。

本文將深入解析適配器模式的概念、應用場景、實現方法,并通過代碼示例幫助大家理解如何在實際開發中使用適配器模式。


1. 適配器模式簡介

適配器模式屬于結構型模式,它通過將一個類的接口轉換為客戶端所期待的另一個接口,使得原本接口不兼容的類可以一起工作。

定義

適配器模式(Adapter Pattern)是通過“適配器類”對兩個接口進行轉換,從而使得不兼容的接口能夠正常交互和工作。簡單來說,它充當了一個橋梁,使得接口不匹配的類能夠協同工作。


2. 適配器模式的結構

適配器模式主要包含以下幾個部分:

  • 目標接口(Target):客戶端所需要的接口,它是適配器模式的核心。
  • 源接口(Adaptee):需要被適配的現有接口。這個接口與目標接口不兼容,需要通過適配器進行轉換。
  • 適配器(Adapter):適配器實現了目標接口,調用源接口的相關方法,以達到兼容的效果。

UML 圖示

圖像來源

 
  • Client:客戶端,調用目標接口的代碼。
  • Target:目標接口,客戶端期待的接口。
  • Adapter:適配器類,適配源接口(Adaptee)到目標接口(Target)。
  • Adaptee:源接口,原有的不兼容接口。

3. 適配器模式的類型

適配器模式可以分為兩種常見的類型,具體選擇哪種取決于應用場景:

3.1 類適配器模式(Class Adapter)

類適配器通過繼承源類(Adaptee)來實現目標接口(Target)。在類適配器中,適配器通過繼承的方式來實現接口的適配。

3.2 對象適配器模式(Object Adapter)

對象適配器通過組合(而非繼承)來實現目標接口,適配器將源對象作為成員變量,并通過調用源對象的方法來完成適配。這種方式更加靈活,因為它不依賴于類的繼承關系。


4. 適配器模式的應用場景

適配器模式通常用于以下幾種情況:

  1. 需要復用現有類的功能,但接口不兼容時: 如果已有的類或者模塊接口與當前系統中的接口不兼容,可以使用適配器模式來進行適配。

  2. 系統中多個類需要轉換成統一接口時: 如果系統中有多個類,客戶端希望統一調用它們的接口,而這些類的接口不同,可以通過適配器模式進行統一適配。

  3. 第三方庫的接口與系統不兼容時: 在集成第三方庫時,庫的接口可能與現有系統的接口不匹配,適配器模式可以幫助進行接口轉換。


5. 適配器模式的優缺點

優點

  • 解耦:通過適配器模式,客戶端和原有接口之間的耦合度降低,客戶端不再依賴于源接口的實現細節。
  • 提高兼容性:適配器模式使得兩個不兼容的接口能夠協同工作,擴展性好。
  • 代碼復用性強:可以將已有類的功能復用到新的接口上,避免重復代碼。

缺點

  • 增加系統復雜性:由于引入了適配器類,可能會增加代碼的復雜度,導致系統結構變得更加復雜。
  • 性能開銷:適配器模式需要額外的對象包裝和轉換,可能會導致一定的性能開銷。

6. 適配器模式的實現

6.1 示例:類適配器模式

假設我們有一個需求,需要將一個舊的類(OldSystem)的接口適配到新的系統接口(TargetSystem)中。我們通過繼承的方式來實現適配。

# 目標接口
class TargetSystem:def request(self):pass# 源接口
class OldSystem:def specific_request(self):return "Old system request"# 類適配器:繼承源接口,適配成目標接口
class Adapter(TargetSystem, OldSystem):def request(self):# 調用源接口的方法,并將其適配為目標接口return self.specific_request()# 客戶端代碼
if __name__ == "__main__":target = Adapter()print(target.request())  # 輸出:Old system request
解釋:
  • TargetSystem 是客戶端期望的目標接口。
  • OldSystem 是現有的接口,它的方法是 specific_request,客戶端不直接兼容。
  • Adapter 繼承了 TargetSystemOldSystem,并實現了目標接口的 request 方法,將其適配為源接口的方法 specific_request

6.2 示例:對象適配器模式

在對象適配器模式中,我們不通過繼承,而是通過組合將源對象與目標接口適配。

# 目標接口
class TargetSystem:def request(self):pass# 源接口
class OldSystem:def specific_request(self):return "Old system request"# 對象適配器:通過組合的方式適配
class Adapter(TargetSystem):def __init__(self, old_system: OldSystem):self.old_system = old_system  # 組合OldSystem實例def request(self):# 調用源接口的方法,將其適配為目標接口return self.old_system.specific_request()# 客戶端代碼
if __name__ == "__main__":old_system = OldSystem()target = Adapter(old_system)print(target.request())  # 輸出:Old system request
解釋:
  • TargetSystem 是目標接口,客戶端期望調用的接口。
  • OldSystem 是已有的源接口,無法直接滿足目標接口。
  • Adapter 類通過組合 OldSystem 的實例來實現目標接口。

7. 適配器模式的總結

適配器模式是一個非常實用的設計模式,它通過將不兼容的接口轉換為目標接口,幫助我們解決系統中不同模塊或類之間接口不一致的問題。無論是類適配器模式還是對象適配器模式,都能夠使得不同接口的類能夠一起工作,提高代碼的復用性、靈活性和擴展性。

適配器模式的核心優勢

  • 解決接口不兼容問題。
  • 保持原有系統的可擴展性和復用性。
  • 降低系統之間的耦合度。

適配器模式的應用場景

  • 接口不兼容時需要進行轉換。
  • 在軟件開發中集成第三方庫時,常常需要進行接口適配。
  • 系統需要統一多個接口時,適配器模式非常適用。

希望通過本文的介紹,能夠幫助你更好地理解適配器模式,并能夠在實際開發中靈活使用它。

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

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

相關文章

Vmware安裝centos

用來記錄自己安裝的過程 一、創建虛擬機安裝centos鏡像 點擊完成后,等待一會會進入centos的系統初始化界面 二、centos初始化配置 三、配置網絡 1、虛擬網絡編輯器,開啟VMnet1、VMnet8的DHCP vmware左上角工具欄,點擊【編輯】->【虛擬網…

Unity-Mirror網絡框架-從入門到精通之Chat示例

文章目錄 前言Chat聊天室Authentication授權ChatAuthenticatorChat示例中的授權流程聊天Chat最后 前言 在現代游戲開發中,網絡功能日益成為提升游戲體驗的關鍵組成部分。Mirror是一個用于Unity的開源網絡框架,專為多人游戲開發設計。它使得開發者能夠輕…

知識問答系統

文章目錄 早期的問答系統基于信息檢索的問答系統基于知識庫的問答系統CommunityQA/FAQ-QA:基于問答對匹配的問答系統Hybrid QA Framework混合問答系統框架早期的問答系統 20世紀六七十年代,早期的NLIDB(Natural Language Interface toData bBase)伴隨著人工智能的研發逐步興起…

第3章:Go語言復合數據類型

第3章:Go語言復合數據類型 1. 數組 1.1 數組聲明和初始化 // 方式1:聲明固定長度數組 var numbers [5]int // 聲明一個包含5個整數的數組,默認零值// 方式2:初始化數組 arr1 : [5]int{1, 2, 3, 4, 5} // 完全初始化// 方式3&…

uniapp-vue3 實現, 一款帶有絲滑動畫效果的單選框組件,支持微信小程序、H5等多端

采用 uniapp-vue3 實現, 是一款帶有絲滑動畫效果的單選框組件,提供點狀、條狀的動畫過渡效果,支持多項自定義配置,適配 web、H5、微信小程序(其他平臺小程序未測試過,可自行嘗試) 可到插件市場下載嘗試&…

深度學習GPU服務器推薦:打造高效運算平臺

文章來源于百家號:GPU服務器廠家 在深度學習和人工智能領域,一個高性能的GPU服務器是研究和開發工作的關鍵。今天,我們將為大家推薦一款基于詳細硬件配置表的深度學習GPU服務器,它專為高效運算和數據處理而設計。 一、機箱設計 …

2025第1周 | JavaScript中的正則表達式

目錄 1. 正則表達式是個什么東東?1.1 怎么定義正則1.2 對象字面量方式1.3 類創建方式 2. 怎么使用2.1 實例方法2.1.1 exec方法2.1.2 test方法 2.2 字符串中的方法2.2.1 match/matchAll2.2.2 replace/replaceAll2.2.3 split2.2.4 search 3. 規則3.1 修飾符3.2 字符類…

大模型LLM-Prompt-OPTIMAL

1 OPTIMAL OPTIMAL 具體每項內容解釋如下: Objective Clarity(目標清晰):明確定義任務的最終目標和預期成果。 Purpose Definition(目的定義):闡述任務的目的和它的重要性。 Information Gat…

78、使用愛芯派2_AX630C開發板 3.2T高有效算力 低功耗 支持AI-ISP真黑光實驗

基本思想:使用愛心元智最新的版本開發板進行實驗 AX630C、AX620Q 都是 620E 這一代 一、參考這個官方教程,先把代碼在本地交叉編譯完成 https://github.com/AXERA-TECH/ax620e_bsp_sdk 然后在拷貝到620c設備上 root@ax630c:~/ax620e_bsp_sdk/msp/out/arm64_glibc/bin# ./…

C語言 掃雷程序設計

目錄 1.main函數 2.菜單打印menu函數 3.游戲game函數 4.宏定義 5.界面初始化 6.打印界面 7.設置雷 8.統計排查坐標周圍雷的個數 9.排查雷 10.總代碼 test.c代碼 game.h代碼 game.c代碼 結語: 一個簡單的掃雷游戲,通過宏定義可以修改行列的…

《高速公路警察模擬器》

一個引人入勝的警察故事在等著你,你可以選擇扮演男警官或女警官。公路警察模擬器》擁有休閑和模擬兩種游戲模式,將兩個世界的精華結合在一起:在身臨其境的虛擬環境中自由駕駛和行走,在故事驅動的游戲中解決各種令人興奮的案件。探…

EasyGBS小知識:如何確保攝像機的網絡連接穩定?

在當今數字化時代,視頻監控系統已成為保障安全和提高效率的重要工具。然而,攝像機的網絡連接穩定性直接關系到監控系統的可靠性和有效性。為了確保視頻監控系統能夠持續穩定地運行,我們需要從硬件、網絡設置、軟件與監控以及安裝與維護等多個…

微服務-Eureka

Eureka的作用 使用RestTemplate完成遠程調用需要被調用者的ip和端口,從而能夠發起http請求,但是如果有很多個實例也更加不能有效的處理,而且我們又該如何知道這些實例是否健康呢。所以就有了很多的注冊中心比如Eureka、Nacos等等。 服務注…

LabVIEW軟件侵權分析與應對

問:如果涉及到LabVIEW軟件的仿制或模仿,特別是在功能、界面等方面,如何判斷是否構成侵權?該如何應對? 答:LabVIEW軟件的侵權問題,尤其是在涉及到仿制或模仿其功能、界面、設計等方面&#xff0…

MATLAB仿真:基于GS算法的經大氣湍流畸變渦旋光束波前校正仿真

GS算法流程 GS(Gerchberg-Saxton)相位恢復算法是一種基于傅里葉變換的最速下降算法,可以通過輸出平面和輸入平面上光束的光強分布計算出光束的相位分布。圖1是基于GS算法的渦旋光束畸變波前校正系統框圖,在該框圖中,已…

數樹數(中等難度)

題目: 解題代碼: n,qmap(int,input().split())#分別輸入層數和路徑數量 for i in range(q):sinput()#輸入“L”或“R”x1for j in s:if j "L":xx*2-1 #!!!規律else:xx*2print(x)

高效內存管理與調試技巧:深入解析 AddressSanitizer

在現代 C開發中,內存管理是一個至關重要但也容易出錯的領域。即使使用了智能指針和其他高效工具,復雜的項目仍可能出現內存泄漏、非法訪問等問題。為了解決這些問題,Google 開發了一個強大的工具——AddressSanitizer (ASan)。本文將詳細介紹…

Vue3 內置組件之Teleport

文章目錄 Vue3 內置組件之Teleport概述用法 Vue3 內置組件之Teleport 概述 Teleport 中文翻譯為“瞬間移動”&#xff0c;顧名思義&#xff0c;在Vue3 中 <Teleport> 組件可以將組件中內容移動到指定的目標元素上。 用法 <script setup> import {ref} from &qu…

【我的 PWN 學習手札】IO_FILE 之 FSOP

FSOP&#xff1a;File Stream Oriented Programming 通過劫持 _IO_list_all 指向偽造的 _IO_FILE_plus&#xff0c;進而調用fake IO_FILE 結構體對象中被偽造的vtable指向的惡意函數。 目錄 前言 一、glibc-exit函數淺析 二、FSOP 三、Largebin attack FSOP &#xff08;…

函數指針的用法

函數指標一些相關的用法和注意事項。以下將詳細說明&#xff1a; 1. 基本寫法: 這是最常見且明確的寫法&#xff0c;尤其在處理重載函數時非常有用。 void (GirlFriend::*girl2)(QString) &GirlFriend::hungry;void: 指標所指向的函數的回傳型別。(GirlFriend::*): 表示…