【設計模式】適配器模式:讓不兼容的接口和諧共處

引言

在軟件開發中,我們經常會遇到這樣的情況:兩個已經存在的接口無法直接協同工作,但我們又希望它們能夠無縫對接。這時,適配器模式就派上用場了。適配器模式(Adapter Pattern)是一種結構型設計模式,它允許將一個類的接口轉換成客戶端所期望的另一個接口。通過這種方式,原本不兼容的接口可以一起工作。

本文將通過生動的比喻、詳細的代碼示例和常見應用場景,幫助你輕松掌握適配器模式的核心概念和實際應用。


1. 適配器模式的核心概念

1.1 什么是適配器模式?

適配器模式就像是現實生活中的電源適配器。假設你有一個美國的電器設備,但你在中國使用時,插頭不匹配。這時,你需要一個適配器來將美國的插頭轉換成中國的插座。同樣,在軟件中,適配器模式通過一個中間層(適配器)來轉換一個類的接口,使其與客戶端期望的接口兼容。

1.2 適配器模式的結構

適配器模式主要由以下幾個角色組成:

  • 目標接口(Target):客戶端所期望的接口。
  • 適配者(Adaptee):需要被適配的類或接口。
  • 適配器(Adapter):將適配者的接口轉換成目標接口的類。

適配器模式有兩種實現方式:類適配器和對象適配器。

  • 類適配器:通過多重繼承來實現適配。
  • 對象適配器:通過組合來實現適配。

在C++中,由于多重繼承的復雜性,我們通常更傾向于使用對象適配器。


2. 適配器模式的代碼示例

為了更好地理解適配器模式,我們來看一個具體的例子。假設我們有一個舊的日志系統(Adaptee),它提供了一個LogToFile方法,用于將日志記錄到文件中。但現在,客戶端期望使用一個新的日志接口(Target),該接口提供了一個Log方法。我們需要一個適配器來使舊的日志系統能夠與新的接口兼容。
適配器模式日志系統適配

2.1 定義目標接口

首先,我們定義客戶端所期望的目標接口:

#include <string>class Logger {
public:virtual void Log(const std::string& message) = 0;virtual ~Logger() {}
};

2.2 定義適配者

接下來,定義需要被適配的舊日志系統:

class OldLogger {
public:void LogToFile(const std::string& message) {// 模擬將日志記錄到文件std::cout << "Logging to file: " << message << std::endl;}
};

2.3 實現適配器

現在,我們實現適配器類,它繼承自目標接口Logger,并持有一個OldLogger的實例:

class LoggerAdapter : public Logger {
private:OldLogger* oldLogger;
public:LoggerAdapter(OldLogger* logger) : oldLogger(logger) {}void Log(const std::string& message) override {oldLogger->LogToFile(message);}
};

2.4 客戶端使用

客戶端代碼可以這樣使用適配器:

#include <iostream>int main() {OldLogger oldLogger;LoggerAdapter adapter(&oldLogger);adapter.Log("This is a test message.");return 0;
}

在上面的例子中,LoggerAdapter類充當了適配器的角色,它將OldLoggerLogToFile方法適配成了Logger接口的Log方法。這樣,客戶端就可以通過Logger接口來使用舊的日志系統,而無需修改舊的代碼。


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

適配器模式在實際開發中有很多應用場景,以下是幾個常見的例子:

3.1 遺留系統的集成

適配器模式系統適配
當我們需要將一個遺留系統集成到新的系統中時,遺留系統的接口可能與新系統不兼容。這時,可以使用適配器模式來使遺留系統與新系統協同工作,而無需修改遺留系統的代碼。

3.2 第三方庫的適配

在使用第三方庫時,如果庫的接口與我們的系統不匹配,我們可以使用適配器模式來封裝第三方庫的接口,使其符合我們的系統要求。

3.3 接口的統一

在某些情況下,我們可能有多個類似的類,但它們的接口不一致。使用適配器模式,我們可以為這些類創建統一的接口,從而簡化客戶端代碼。


4. 適配器模式的優缺點

4.1 優點

  • 提高代碼的復用性:通過適配器,我們可以重用現有的類,而無需修改其代碼。
  • 增強系統的靈活性:適配器模式允許我們在不改變現有代碼的情況下,添加新的功能或集成新的系統。
  • 解耦客戶端和適配者:客戶端只需要與目標接口交互,而不需要了解適配者的具體實現。

4.2 缺點

  • 增加系統的復雜性:引入適配器類會增加系統的類數量,從而可能增加系統的復雜性。
  • 性能開銷:在某些情況下,適配器可能會引入額外的性能開銷,尤其是在頻繁調用的場景中。

5. 總結

適配器模式是一種非常實用的設計模式,它通過一個中間層來轉換接口,使不兼容的類能夠協同工作。在C++中,我們通常使用對象適配器來實現這一模式。通過本文的講解和代碼示例,相信你已經對適配器模式有了深入的理解。在實際開發中,合理地應用適配器模式可以提高代碼的復用性和系統的靈活性,幫助我們更好地應對變化的需求。

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

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

相關文章

doris/clickhouse常用sql

一、doris常用SQL 1、doris統計數據庫的總大小&#xff08;單位&#xff1a;MB&#xff09; SELECT table_schema AS database_name,ROUND(SUM(data_length) / 1024 / 1024, 2) AS database_size_MB FROM information_schema.tables WHERE table_schema NOT IN (information…

軟件架構分層策略對比及Go項目實踐

一、水平分層 vs 功能劃分 vs 組件劃分 維度水平分層功能劃分組件劃分核心思想按垂直層次劃分職責&#xff08;如表示層、業務層、數據層&#xff09;按業務功能模塊劃分&#xff08;如用戶管理、訂單服務、支付模塊&#xff09;按技術或業務能力劃分獨立組件&#xff08;如數…

Linux進程地址空間、寫時拷貝

1.進程地址空間 感知進程地址空間 C/C有內存的概念&#xff0c;內存空間包括棧、堆、代碼段等等&#xff0c;下面是32位下的內存分布圖&#xff0c;自底向上(由0x00000000至0xFFFFFFFF); 下面通過程序來驗證各個數據在該空間的地址&#xff0c;由此感知整個地址空間的分布情…

python成功解決AttributeError: can‘t set attribute ‘lines‘

文章目錄 報錯信息與原因分析解決方法示例代碼代碼解釋總結 報錯信息與原因分析 在使用 matplotlib繪圖時&#xff0c;若嘗試使用 ax.lines []來清除圖表中的線條&#xff0c;會遇到AttributeError: can’t set attribute錯誤。這是因為 ax.lines是一個只讀屬性&#xff0c;不…

從零搭建微服務項目Pro(第6-2章——微服務鑒權模塊SpringSecurity+JWT)

前言&#xff1a; 在上一章已經實現了SpringBoot單服務的鑒權&#xff0c;在導入SpringSecurity的相關依賴,以及使用JWT生成的accessToken和refreshToken能夠實現不同Controller乃至同一Controller中不同接口的權限單獨校驗。上一章鏈接如下&#xff1a; 從零搭建微服務項目Pr…

win安裝軟件

win安裝軟件 jdk安裝 jdk安裝 首先去官網下載適合系統版本的JDK&#xff0c;下載地址&#xff1a; http://www.oracle.com/technetwork/java/javase/downloads/index.html進入下載頁面&#xff0c;如下圖&#xff1a; 首先選擇&#xff1a;Accept License Agreement單選按鈕&…

Prompt-Tuning 提示詞微調

1. Hard Prompt 定義&#xff1a; Hard prompt 是一種更為具體和明確的提示&#xff0c;要求模型按照給定的信息生成精確的結果&#xff0c;通常用于需要模型提供準確答案的任務. 原理&#xff1a; Prompt Tuning原理如下圖所示&#xff1a;凍結主模型全部參數&#xff0c;在…

【Vue生命周期的演變:從Vue 2到Vue 3的深度剖析】

Vue生命周期的演變&#xff1a;從Vue 2到Vue 3的深度剖析 1. 生命周期鉤子的概念與意義 Vue框架通過生命周期鉤子函數使開發者可以在組件不同階段執行自定義邏輯。這些鉤子函數是Vue組件生命周期中的關鍵切入點&#xff0c;對于控制組件行為至關重要。 2. Vue 2中的生命周期…

java ai 圖像處理

Java AI 圖像處理 圖像處理是人工智能&#xff08;AI&#xff09;領域中非常重要的一個應用方向。通過使用Java編程語言和相應的庫&#xff0c;我們可以實現各種圖像處理任務&#xff0c;如圖像識別、圖像分類、圖像分割等。本文將介紹一些常見的圖像處理算法&#xff0c;并通過…

從 0~1 保姆級 詳細版 PostgreSQL 數據庫安裝教程

PostgreSQL數據庫安裝 PostgreSQL官網 【PostgreSQL官網】 | 【PostgreSQL安裝官網_Windows】 安裝步驟 step1&#xff1a; 選擇與電腦相對應的PostgreSQL版本進行下載。 step2&#xff1a; 雙擊打開剛才下載好的文件。 step3&#xff1a; 在彈出的setup窗口中點擊 …

Keil MDK中禁用半主機(No Semihosting)

在 ARM 編譯器&#xff08;如 Keil MDK&#xff09; 中禁用半主機&#xff08;Semihosting&#xff09;并實現標準庫的基本功能&#xff0c;需要以下步驟&#xff1a; 1. 禁用半主機 #pragma import(__use_no_semihosting) // 禁用半主機模式作用&#xff1a;防止標準庫函數&…

github | 倉庫權限管理 | 開權限

省流版總結&#xff1a; github 給別人開權限&#xff1a;倉庫 -> Setting -> Cllaborate -> Add people GitHub中 將公開倉庫改為私有&#xff1a;倉庫 -> Setting -> Danger Zone&#xff08;危險區&#xff09; ->Change repository visibility( 更改倉…

快速部署大模型 Openwebui + Ollama + deepSeek-R1模型

背景 本文主要快速部署一個帶有web可交互界面的大模型的應用&#xff0c;主要用于開發測試節點&#xff0c;其中涉及到的三個組件為 open-webui Ollama deepSeek開放平臺 首先 Ollama 是一個開源的本地化大模型部署工具,提供與OpenAI兼容的Api接口&#xff0c;可以快速的運…

極狐GitLab 項目導入導出設置介紹?

極狐GitLab 是 GitLab 在中國的發行版&#xff0c;關于中文參考文檔和資料有&#xff1a; 極狐GitLab 中文文檔極狐GitLab 中文論壇極狐GitLab 官網 導入導出設置 (BASIC SELF) 導入和導出相關功能的設置。 配置允許的導入源 在從其他系統導入項目之前&#xff0c;必須為該…

信奧還能考嗎?未來三年科技特長生政策變化

近年來&#xff0c;科技特長生已成為名校錄取的“黃金敲門磚”。 從CSP-J/S到NOI&#xff0c;編程競賽成績直接關聯升學優勢。 未來三年&#xff0c;政策將如何調整&#xff1f;家長該如何提前布局&#xff1f; 一、科技特長生政策趨勢&#xff1a;2025-2027關鍵變化 1. 競…

AI測試用例生成平臺

AI測試用例生成平臺 項目背景技術棧業務描述項目展示項目重難點 項目背景 針對傳統接口測試用例設計高度依賴人工經驗、重復工作量大、覆蓋場景有限等行業痛點&#xff0c;基于大語言模型技術實現接口測試用例智能生成系統。 技術棧 LangChain框架GLM-4模型Prompt Engineeri…

操作系統-PV

&#x1f9e0; 背景&#xff1a;為什么會有 PV&#xff1f; 類比&#xff1a;內存&#xff08;生產者&#xff09; 和 CPU&#xff08;消費者&#xff09; 內存 / IO / 磁盤 / 網絡下載 → 不斷“生產數據” 例如&#xff1a;讀取文件、下載視頻、從數據庫加載信息 CPU → 負…

工廠方法模式詳解及在自動駕駛場景代碼示例(c++代碼實現)

模式定義 工廠方法模式&#xff08;Factory Method Pattern&#xff09;是一種創建型設計模式&#xff0c;通過定義抽象工廠接口將對象創建過程延遲到子類實現&#xff0c;實現對象創建與使用的解耦。該模式特別適合需要動態擴展產品類型的場景。 自動駕駛感知場景分析 自動駕…

基于 S2SH 架構的企業車輛管理系統:設計、實現與應用

在企業運營中&#xff0c;車輛管理是一項重要工作。隨著企業規模的擴大&#xff0c;車輛數量增多&#xff0c;傳統管理方式效率低下&#xff0c;難以滿足企業需求。本文介紹的基于 S2SH 的企業車輛管理系統&#xff0c;借助現代化計算機技術&#xff0c;實現車輛、駕駛員和出車…

IntelliJ IDEA download JDK

IntelliJ IDEA download JDK 自動下載各個版本JDK&#xff0c;步驟 File - Project Structure &#xff08;快捷鍵 Ctrl Shift Alt S&#xff09; 如果下載失敗&#xff0c;換個下載站點吧。一般選擇Oracle版本&#xff0c;因為java被Oracle收購了 好了。 花里胡哨&#…