設計模式十四:適配器模式(Adapter Pattern)

適配器模式(Adapter Pattern)是一種結構型設計模式,用于將一個類的接口轉換成客戶端期望的另一個接口,使原本不兼容的類可以一起工作。

適配器模式的類型

  1. 類適配器(通過多重繼承實現)

  2. 對象適配器(通過組合實現,更常用)

示例代碼

1. 對象適配器示例(推薦方式)

#include <iostream>// 目標接口(客戶端期望的接口)
class Target {
public:virtual ~Target() = default;virtual void request() const {std::cout << "Target: 標準請求\n";}
};// 需要適配的類(不兼容的接口)
class Adaptee {
public:void specificRequest() const {std::cout << "Adaptee: 特殊請求\n";}
};// 適配器類(將Adaptee接口轉換為Target接口)
class Adapter : public Target {
private:Adaptee* adaptee;
public:Adapter(Adaptee* a) : adaptee(a) {}void request() const override {std::cout << "Adapter: 轉換請求\n";adaptee->specificRequest();}
};int main() {Adaptee* adaptee = new Adaptee();Target* target = new Adapter(adaptee);target->request();  // 客戶端調用統一的接口delete target;delete adaptee;return 0;
}

2. 類適配器示例(需要多重繼承)

#include <iostream>// 目標接口
class Target {
public:virtual ~Target() = default;virtual void request() const {std::cout << "Target: 標準請求\n";}
};// 需要適配的類
class Adaptee {
public:void specificRequest() const {std::cout << "Adaptee: 特殊請求\n";}
};// 類適配器(通過多重繼承)
class Adapter : public Target, private Adaptee {
public:void request() const override {std::cout << "Adapter: 轉換請求\n";specificRequest();  // 調用Adaptee的方法}
};int main() {Target* target = new Adapter();target->request();delete target;return 0;
}

?UML結構

?

要點總結

1、Adapter模式主要應用于“希望復用一些現存的類,但是接口又與復用環境要求不一致的情況”,在遺留代碼復用、類庫遷移等方面非常有用。
2、GoF 23 定義了兩種Adapter模式的實現結構:對象適配器和類適配器。但類適配器采用“多繼承”的實現方式,一般不推薦使用。對象適配器采用“對象組合”的方式,更符合松耦合精神。
3、Adapter模式可以實現的非常靈活,不必拘泥于Gof23中定義的兩種結構。例如,完全可以將Adapter模式中的“現存對象”作為新的接口方法參數,來達到適配的目的。?

適配器模式的應用場景

  1. 需要使用現有類,但其接口與你的代碼不兼容時

  2. 想復用一些現有的子類,但這些子類缺少一些公共功能

  3. 需要統一多個不同類的接口

優點

  • 單一職責原則:可以將接口轉換代碼與業務邏輯分離

  • 開閉原則:可以在不修改現有代碼的情況下引入新的適配器

缺點

  • 代碼整體復雜度增加:需要新增一系列接口和類

?

適配器模式在C++標準庫中也有應用,例如stackqueue就是通過適配其他容器(如deque)實現的。?

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

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

相關文章

力扣經典算法篇-38-組合(回溯算法)

1、題干 給定兩個整數 n 和 k&#xff0c;返回范圍 [1, n] 中所有可能的 k 個數的組合。 你可以按 任何順序 返回答案。 示例 1&#xff1a; 輸入&#xff1a;n 4, k 2 輸出&#xff1a; [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ] 示例 2&#xff1a; 輸入&#xff1a;…

多人命題系統

目 錄 摘 要 Abstract 1 系統概述 1.1 概述 1.2課題意義 1.3 主要內容 2 系統開發環境 2. 1 JAVA簡介 2. .2 B/S架構 2.3 SSM三大框架 2.4訪問數據庫實現方法 2.5 系統對MySQL數據庫的兩種連接方式 3 需求分析 3.1技術可行性&#xff1a;技術背景…

UDP_千兆光通信(四)Tri Mode Ethernet MAC ip核

Tri Mode Ethernet MAC ip核使用與例程分析 一、 Tri Mode Ethernet MAC ip核功能 二、 Tri Mode Ethernet MAC ip核配置 數據傳輸速率 主要設置接口 幀濾波功能選擇,以及流控選擇 三、 Tri Mode Ethernet MAC ip核使用 3.1 ip核接口 3.2 ip核接口說明 3.2.1 tx_ifg_delay 3.2…

Linux網絡:多路轉接 epoll

Linux網絡&#xff1a;多路轉接 epoll一、epoll三個接口函數1、epoll_create2、epoll_ctl3、epoll_wait二、epoll的工作原理三、epoll的echo_server1、EpollServer類2、構造函數3、事件循環4、事件派發5、事件處理6、測試四、LT和ET模式1、LT2、ET五、項目代碼一、epoll三個接口…

uniapp 微信小程序 列表點擊分享 不同的信息

<button open-type"share" plain class"item share" click.stop"shareFn(item)"><text>分享</text> </button>import {onShareAppMessage} from dcloudio/uni-applet shareObj ref({})// 將點擊后的分享設置信息 關鍵…

C# 匿名方法詳解

C# 匿名方法詳解 引言 在C#編程語言中,匿名方法是使用Lambda表達式創建的沒有名稱的方法。它們在LINQ查詢、事件處理和其他場合中非常有用。本文將詳細介紹C#匿名方法的基本概念、語法、使用場景以及優勢。 匿名方法的概念 匿名方法是一種無需顯式定義名稱的方法。在C#中,…

SD卡簡介與驅動開發

基本概念 存儲卡有很多種類&#xff0c;CF卡、記憶棒、SD卡、XD卡、MMC卡、MS卡、TF卡、MicroSD卡等。平時最常見的有SD卡和MicroSD卡兩種&#xff0c; SD卡和MicroSD只是兩張卡的大小不同&#xff0c;規格版本是完全相同的&#xff0c;均由SD卡協會推出。 SD卡有不少規范&…

大數據平臺數倉數湖hive之拉鏈表高效實現

對于緩慢變化的維度表&#xff0c;如客戶表&#xff0c;員工表&#xff0c;為了不丟失歷史數據&#xff0c;又不至于太浪費存儲空間&#xff0c;我們采用拉鏈表實現。 實現過程如下&#xff1a; 1、采集初始數據&#xff1a; 1.1 從mysql導出數據到hdfs /data/dolphinschedu…

【VSCode】常用插件推薦(持續更新~)

以下的這些插件都有使用過&#xff0c;可取對自己編碼有用的選擇安裝。&#x1f9e0; 智能補全 / 提示類插件 1. Auto Import在編碼時選擇有對應導入包的選項&#xff0c;自動為 JS/TS 文件中的使用項補全并添加 import 聲明&#xff0c;極大提高開發效率。2. Iconify IntelliS…

ICML 2025 | 深度剖析時序 Transformer:為何有效,瓶頸何在?

本文介紹帝國理工學院等機構在 ICML 2025 發表的最新研究成果。該研究并未提出新模型&#xff0c;而是對現有時間序列 Transformer 模型進行了一次深刻的拷問——為何結構更簡單的 Transformer&#xff08; PatchTST, iTransformer&#xff09;在各大基準測試中&#xff0c;反而…

AIBOX內置5G天線設計

AIBOX內置5G天線設計AIBOX的天線種類天線種類及數量&#xff1a;運營商5G天線*4&#xff0c;1.4G天線*2、wifi天線*1天線形式&#xff1a;內置PCB天線。天線安裝方式&#xff1a;卡扣固定&#xff0c;安裝至設備外殼內壁。RG-178同軸線或UFL1.37mm同軸線連接至主板&#xff0c;…

低通濾波器的原理以及作用

低通濾波器&#xff08;Low-Pass Filter, LPF&#xff09;是一種允許低頻信號通過&#xff0c;同時衰減或阻止高頻信號的電子電路或數字信號處理算法。其核心原理和作用如下&#xff1a;一、工作原理 1. 頻率選擇性- 低通濾波器基于頻率對信號進行篩選&#xff0c;其傳遞函數在…

[AI Coding] 一.騰訊CodeBuddy IDE內測、安裝及基本用法(國產AI IDE啟航)

在人工智能迅猛發展的今天&#xff0c;AI Coding 正逐步改變傳統編程范式。廣義上&#xff0c;AI Coding 是指以大語言模型&#xff08;LLMs&#xff09;為核心驅動&#xff0c;借助自然語言理解能力&#xff0c;自動生成、補全、調試與解釋代碼的智能編程方式。它不僅顯著降低…

《網安處罰裁量基準》碼農合規指北 v1.0——if (違規) { 罰金++ } else { 合規運行 }

尊敬的審核&#xff1a; 本人文章《〈網安處罰裁量基準〉碼農合規指北 v1.0——if (違規) { 罰金 } else { 合規運行 }》 1. 純屬技術交流&#xff0c;無任何違法內容 2. 所有法律引用均來自公開條文 3. 請依據《網絡安全法》第12條“不得無故刪除合法內容”處理 附&#xff1a…

機器學習——邏輯回歸(LogisticRegression)實戰案例:信用卡欺詐檢測數據集

使用邏輯回歸識別 信用卡欺詐行為&#xff1a;基于creditcard.csv的實戰與評估分析 項目背景 在金融行業中&#xff0c;信用卡欺詐檢測是一項關鍵任務。欺詐交易在整個交易中占比極低&#xff0c;導致數據極度不平衡。本案例通過經典數據集 creditcard.csv&#xff0c;構建邏輯…

Helm在Kubernetes中的應用部署指南與案例解析

在上一章節中&#xff0c;我們已經介紹了Helm的部署和基本使用方法。本章將通過實際案例&#xff0c;詳細演示如何使用Helm在Kubernetes集群中部署應用。一、Helm 核心價值解析優勢解決的問題類比傳統方式應用模板化重復編寫 YAML 文件手動編寫 20 資源清單文件版本控制缺乏部署…

如何最簡單、通俗地理解線性回歸算法? 線性回歸模型在非線性數據上擬合效果不佳,如何在保持模型簡單性的同時改進擬合能力?

線性回歸作為統計學與機器學習領域中最基礎且最重要的算法之一&#xff0c;其應用廣泛且深遠。它不僅是回歸分析的入門方法&#xff0c;更是后續復雜模型構建的重要理論基礎。理解線性回歸算法的本質&#xff0c;既有助于提升數據分析的能力&#xff0c;也能為掌握更復雜的機器…

藍橋杯----超聲波

&#xff08;一&#xff09;、超聲波1、原理&#xff08;圖 一&#xff09;發送信號階段&#xff1a;單片機通過翻轉發送的引腳P1^0&#xff0c;發送8個40MHZ的方波&#xff0c;此時開始計時。等待接收信號&#xff1a;通過單片機的接收引腳P1^1檢測&#xff0c;未接收到信號時…

Java學習-運算符

1.在代碼中&#xff0c;如果有小數參與計算&#xff0c;結果有可能不精確。2.整數參與計算&#xff0c;結果只能是整數。3.數字進行運算時&#xff0c;數據類型不一樣不能運算&#xff0c;需要轉成一樣的&#xff0c;才能運算。&#xff08;1&#xff09;隱式轉換&#xff08;自…

一句話指令實現“2D轉3D”、“圖片提取線稿”

你是否曾為一張2D圖片無法完美展示3D效果而遺憾&#xff1f;是否曾因需要將手繪草圖轉為清晰線稿而耗時費力&#xff1f;這些曾讓設計師、電商賣家、內容創作者頭疼的難題&#xff0c;如今只需一句話指令&#xff0c;即可迎刃而解。一、案例一&#xff1a;2D圖片→3D模型痛點場…