(二)結構型模式:1、適配器模式(Adapter Pattern)(C++實現示例)

目錄

1、適配器模式(Adapter Pattern)含義

2、適配器模式應用場景

3、適配器模式的UML圖學習

4、C++實現適配器模式的示例


1、適配器模式(Adapter Pattern)含義

將一個接口轉換為客戶端所期待的接口,從而使兩個接口不兼容的類可以在一起工作;

適配器模式通常用于將不兼容的類組合在一起工作,或將舊代碼與新代碼集成在一起。

適配器模式還有個別名叫:Wrapper(包裝器),顧名思義就是將目標類用一個新類包裝一下,相當于在客戶端與目標類直接加了一層。

IT世界有句俗語:沒有什么問題是加一層不能解決的

2、適配器模式應用場景

(1)當需要使用一個現存的類,但它提供的接口與我們系統的接口不兼容,而我們還不能修改它時;

(2)當多個團隊獨立開發系統的各功能模塊,然后組合在一起,但由于某些原因事先不能確定接口時。

3、適配器模式的UML圖學習

適配器模式有3個角色:

(1)Target:是一個接口,是客戶端使用的目標接口;

(2)Adaptee:是我們想要的接口,與Target不兼容的類,這個可以是一個接口或類;

(3)Adapter:適配器類,此模式的核心。它需要實現目標接口Target,而且必須引用Adaptee,因為我們要在此類包裝Adaptee的功能;

4、C++實現適配器模式的示例


#include <iostream>
#include <string>// 目標接口
class Target 
{
public:virtual void request() const = 0;
};// 源接口
class Adaptee 
{
public:void specificRequest() const {std::cout << "Adaptee: specificRequest" << std::endl;}
};// 類適配器
class Adapter : public Target, private Adaptee 
{
public:void request() const override {specificRequest();}
};int main() 
{// 使用適配器調用目標接口Target* target = new Adapter();target->request();delete target;return 0;
}

在上述示例中,我們首先定義了目標接口(Target),其中包含了一個純虛函數request()。然后,我們定義了源接口(Adaptee),其中包含了一個具體函數specificRequest()

接著,我們通過類適配器的方式實現了適配器類(Adapter),它繼承自目標接口,并私有繼承源接口。在適配器類中,我們實現了目標接口的純虛函數,內部調用了源接口的具體函數。

在主函數中,我們創建了一個適配器對象,并通過目標接口調用了適配器的request()函數。由于適配器類同時繼承了目標接口和源接口,所以在調用request()函數時,實際上會調用到適配器類中的具體函數。

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

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

相關文章

CompletableFuture

java8中新引入了批量線程處理類CompletableFuture CompletableFuture.allOf是與的關系, 每個都要執行完 CompletableFuture.anyOf是或的關系, 其中一個執行完 以下示例代碼: CompletableFuture.allOf(CompletableFuture.runAsync(() -> {Thread.currentThread().setName(&q…

js常用的方法函數

JavaScript 中有許多常用的內置方法和函數&#xff0c;用于處理字符串、數組、對象、日期等不同類型的數據。以下是一些常見的 JavaScript 方法和函數&#xff1a; 字符串操作&#xff1a; str.length: 返回字符串的長度。 str.charAt(index): 返回指定位置的字符。 str.indexO…

Mac安裝nvm教程及使用

nvm 是 node 版本管理器&#xff0c;也就是說一個 nvm 可以管理多個 node 版本&#xff08;包含 npm 與 npx&#xff09;&#xff0c;可以方便快捷的安裝、切換 不同版本的 node。 1、直接通過brew安裝 執行命令&#xff1a;brew install nvm PS&#xff1a; 如果沒有安裝br…

Golang - 生成和讀取toml文件

代碼示例&#xff1a; package mainimport ("fmt""github.com/pelletier/go-toml""os""path" )func CreateToml(tomlPath string) {tree, err : toml.Load("")if err ! nil {fmt.Println("Error while creating empt…

Oracle database 靜默安裝 oracle 11g 一鍵安裝

基于oracle安裝包中應答文件實現一鍵安裝 支持環境&#xff1a; Linux &#xff1a;centerOS 7 oracle &#xff1a;11.2.0 Oracle應答文件 runInstaller應答文件 /database/response/db_install.rsp netca應答文件 /database/response/netca.rsp dbca應答文件 /database/re…

小程序保留2位小數據,不四舍五入

方法1&#xff1a; parseInt toFixed /* * 保留2位小數&#xff0c;不四舍五入 * 5.992550 >5.99 , 2 > 2.00 * */ const toFixed2Decimal (value) > {return (parseInt(value*100)/100).toFixed(2) } console.log(587.67*100) console.log(toFixed2Decimal(587.67…

python中的運算符號含義,python基本運算符的操作

本篇文章給大家談談python的運算符號有哪些類型&#xff0c;以及python各運算符號的功能說明&#xff0c;希望對各位有所幫助&#xff0c;不要忘了收藏本站喔。 1.算數運算符&#xff08;最常見的&#xff09; 標準算數運算符&#xff08;加減乘除&#xff09; 取余運算…

(provider: SSL Provider, error: 0 - 證書鏈是由不受信任的頒發機構頒發的。)

問題描述 NET6 Code First 使用Update-database時 報錯&#xff1a;A connection was successfully established with the server, but then an error occurred during the login process. (provider: SSL Provider, error: 0 - 證書鏈是由不受信任的頒發機構頒發的。) 解決方…

UML-狀態圖

目錄 狀態圖 狀態圖的圖符 狀態機 狀態 ?轉換 電話機狀態圖 活動圖和狀態圖區別&#xff1a; 狀態圖 狀態圖(Statechart Diagram)是描述一個實體基于事件反應的動態行為&#xff0c;顯示了該實體如何根據當前所處的狀態對不同的事件做出反應。通常我們創建一個UML狀態…

Jmeter設置中文的兩種方式,建議使用第二種

方案一 進入jmeter圖像化界面&#xff0c;選擇Options下的Choose Language&#xff0c;再選擇Chinese(Simplified)。這個就是選擇語言為簡體中文&#xff08;缺陷&#xff1a;這個只是在本次使用時為中文&#xff0c;下次打開默認還是英文的&#xff09; 方案二&#xff08;…

Mybatis框架

Mybatis框架 Mybatis的含義&#xff1a;Mybatis框架是一個持久層框架&#xff0c;幾乎解決了jdbc代碼在手動設置參數和對結果集的手動獲取問題&#xff0c;原本是apache公司的開源項目&#xff0c;最后轉給Google公司。Mybatis會將參數封裝在一個對象中傳遞給數據庫&am…

數學建模(二)線性規劃

課程推薦&#xff1a;6 線性規劃模型基本原理與編程實現_嗶哩嗶哩_bilibili 目錄 一、線性規劃的實例與定義 1.1 線性規劃的實例 1.2 線性規劃的定義 1.3 最優解 1.4 線性規劃的Mathlab標準形式 1.5 使用linprog函數 二、線性規劃模型建模實戰與代碼 2.1 問題提出 2.2…

機器學習深度學習——seq2seq實現機器翻譯(詳細實現與原理推導)

&#x1f468;?&#x1f393;作者簡介&#xff1a;一位即將上大四&#xff0c;正專攻機器學習的保研er &#x1f30c;上期文章&#xff1a;機器學習&&深度學習——seq2seq實現機器翻譯&#xff08;數據集處理&#xff09; &#x1f4da;訂閱專欄&#xff1a;機器學習&…

機器學習編譯系列

機器學習編譯MLC 1. 引言2. 機器學習編譯--概述2.1 什么是機器學習編譯 1. 引言 陳天奇目前任教于CMU&#xff0c;研究方向為機器學習系統。他是TVM、MXNET、XGBoost的主要作者。2022年夏天&#xff0c;陳天奇在B站開設了《機器學習編譯》的課程。 ??《機器學習編譯》課程共分…

立即開始使用 3D 圖像

一、說明 這個故事介紹了使用這種類型的數據來訓練機器學習3D模型。特別是&#xff0c;我們討論了Kaggle中可用的MNIST數據集的3D版本&#xff0c;以及如何使用Keras訓練模型識別3D數字。 3D 數據無處不在。由于我們希望構建AI來與我們的物理世界進行交互&#xff0c;因此使用3…

了解 Langchain?是個啥?:第 1 部分

一、說明 在日常生活中&#xff0c;我們主要致力于構建端到端的應用程序。我們可以使用許多自動 ML 平臺和 CI/CD 管道來自動化 ml 管道。我們還有像Roboflow和Andrew N.G.的登陸AI這樣的工具來自動化或創建端到端的計算機視覺應用程序。 如果我們想在OpenAI或擁抱臉的幫助下創…

Day 26 C++ list容器(鏈表)

文章目錄 list基本概念定義結構雙向迭代器優點缺點List和vector區別存儲結構內存管理迭代器穩定性隨機訪問效率 list構造函數——創建list容器函數原型示例 list 賦值和交換函數原型 list 大小操作函數原型示例 list 插入和刪除函數原型示例 list 數據存取函數原型注意示例 lis…

論文詳解 ——《SNR-Aware Low-light Image Enhancement》

文章目錄 Abstract1.Introduction2. Related Work3. Our Method3.1 Long- and Short-range Branches3.2 SNR-based Spatially-varying Feature Fusion3.3 SNR-guided Attention in Transformer3.4 Loss Function 4. Experiments4.1. Datasets and Implementation Details4.2 Co…

SpringBoot | 使用newWorkStealingPool和CompletableFuture進行并發異步處理

關注wx&#xff1a; CodingTechWork 需求 一個列表操作需要異步處理每個元素&#xff0c;最終需要將列表各個元素的操作結果統一返回&#xff0c;無需關注該列表中的順序執行。這個線程池不會保證任務的順序執行&#xff0c;即為WorkStealing搶占式的工作。 開發模板 線程池…

基于SpringBoot實現MySQL備份與還原

基于SpringBoot實現MySQL備份與還原&#xff0c;需求是在頁面上對所有的平臺數據執行備份和恢復操作&#xff0c;那么就需要使用代碼去調用MySQL備份和恢復的指令&#xff0c;下面是具體實現步驟&#xff1b; MySQL備份表設計 CREATE TABLE IF NOT EXISTS mysql_backups (id …