設計模式-Adapter

定義

適配器設計模式是一種結構型設計模式,用于將一個類的接口變換成客戶端所期待的另一種接口,從而使原本因接口不匹配而無法在一起工作的兩個類能夠在一起工作。

適配器模式包括三種形式:類適配器模式、對象適配器模式、接口適配器模式(或又稱作缺省適配器模式)。

類適配器模式是通過繼承來實現適配器功能。當我們要訪問的接口A中沒有我們想要的方法,卻在另一個接口B中發現了合適的方法,我們又不能改變訪問接口A,在這種情況下,我們可以定義一個適配器p來進行中轉,這個適配器p要實現我們訪問的接口A,這樣我們就能繼續訪問當前接口A中的方法(雖然它目前不是我們的菜),然后再繼承接口B的實現類BB,這樣我們可以在適配器P中訪問接口B的方法了,這時我們在適配器P中的接口A方法中直接引用BB中的合適方法,這樣就完成了一個簡單的類適配器。

對象適配器模式是通過組合來實現適配器功能。

如需進一步了解適配器設計模式,建議閱讀相關書籍。

實現舉例

當然可以,以下是一個使用C++實現的適配器設計模式的例子:

假設我們有一個現有的類RealAudioStream,它實現了音頻流數據的讀取和寫入,但是它的接口不符合我們需要的接口AudioStream。因此,我們需要創建一個適配器類AudioStreamAdapter,它將RealAudioStream的接口適配成AudioStream的接口。

// 現有的類RealAudioStream
class RealAudioStream {
public:virtual void open(const char* filename) = 0;virtual void close() = 0;virtual void read(char* buffer, int size) = 0;virtual void write(const char* buffer, int size) = 0;
};// 需要適配的接口AudioStream
class AudioStream {
public:virtual void open(const char* filename) = 0;virtual void close() = 0;virtual void read(char* buffer, int size) = 0;virtual void write(const char* buffer, int size) = 0;
};// 適配器類AudioStreamAdapter,繼承自RealAudioStream和AudioStream
class AudioStreamAdapter : public RealAudioStream, public AudioStream {
public:void open(const char* filename) override {realStream.open(filename);}void close() override {realStream.close();}void read(char* buffer, int size) override {realStream.read(buffer, size);}void write(const char* buffer, int size) override {realStream.write(buffer, size);}
private:RealAudioStream& realStream; // 引用RealAudioStream對象,實現適配功能
};

在上面的例子中,AudioStreamAdapter類實現了兩個接口RealAudioStreamAudioStream,通過成員變量realStream引用了RealAudioStream對象,實現了適配功能。這樣,我們就可以使用AudioStreamAdapter類來適配RealAudioStream類的接口,使其符合AudioStream接口的要求。

總結

適配器設計模式的特性:

  1. 適配器模式是一種結構型設計模式,用于將一個類的接口變換成客戶端所期待的另一種接口,從而使原本因接口不匹配而無法在一起工作的兩個類能夠在一起工作。
  2. 適配器模式包括三種形式:類適配器模式、對象適配器模式、接口適配器模式(或又稱作缺省適配器模式)。
  3. 類適配器模式是通過繼承來實現適配器功能。
  4. 對象適配器模式是通過組合來實現適配器功能。
  5. 接口適配器模式是給出一個接口,可以動態選擇實現這個接口的具體類,靈活性非常好。

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

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

相關文章

Ubuntu18 Opencv3.4.12 viz 3D顯示安裝、編譯、使用、移植

Opencv3.*主模塊默認包括兩個3D庫 calib3d用于相機校準和三維重建 ,viz用于三維圖像顯示,其中viz是cmake選配。 參考: https://docs.opencv.org/3.4.12/index.html 下載linux版本的源碼 sources。 查看cmake apt list --installed | grep…

App Cleaner Uninstaller Pro 一鍵清理,徹底卸載Mac應用

隨著科技的不斷發展,Mac電腦已經成為許多用戶工作和娛樂的首選。然而,隨著時間的推移,我們的Mac電腦上可能會堆積大量的無效文件和冗余數據,這不僅占用了寶貴的磁盤空間,還可能影響到系統的運行速度。為了解決這一問題…

基于51單片機zigbee溫室大棚監控系統

**單片機設計介紹,基于51單片機zigbee溫室大棚監控系統 文章目錄 一 概要二、功能設計設計思路 三、 軟件設計原理圖 五、 程序六、 文章目錄 一 概要 基于51單片機和Zigbee技術的溫室大棚監控系統是一種用于監測和控制溫室大棚環境的設備。以下是一個基本的設計介…

STM32 CAN通信自定義數據包多幀連發亂序問題

場景: can標準幀中每一幀只能傳輸8字節,而應用中傳輸一包的內容往往超過8字節,因此需要把一個包拆成多個幀發送,接收端才把收到的多幀重新組裝成一個完整的包 問題描述 在一問一答的兩塊板間通信,多幀連發是能夠按照…

UDP分片和丟包與TCP效果對比

UDP 分片 與 丟包,UDP 真的比 TCP 高效嗎? UDP(用戶數據報協議)和TCP(傳輸控制協議)在很多方面都有顯著的區別。總體來說,TCP更適合需要可靠傳輸的應用,例如網頁瀏覽、電子郵件等&a…

信創系列之大數據,分布式數據庫產業鏈跟蹤梳理筆記…

并購優塾 投行界的大叔,大叔界的投行 【產業鏈地圖,版權、內容與免責聲明】1)版權:版權所有,違者必究,未經許可不得翻版、摘編、拷貝、復制、傳播。2)尊重原創:如有引用未標注來源…

CentOS 7啟動時報“Started Crash recovery kernel arming.....shutdown....”問題處理過程

有臺虛擬機由于CPU負載過高而宕機,宕機重啟后停在“Started Crash recovery kernel arming…shutdown…”階段,如下所示: 重置虛擬機,進入grub菜單,按e編輯啟動選項,在linux16 行末,加上&…

【考研】數據結構(更新到循環鏈表)

聲明&#xff1a;所有代碼都可以運行&#xff0c;可以直接粘貼運行&#xff08;只有庫函數沒有聲明&#xff09; 線性表的定義和基本操作 基本操作 定義 靜態&#xff1a; #include<stdio.h> #include<stdlib.h>#define MaxSize 10//靜態 typedef struct{int d…

【追求卓越02】數據結構--鏈表

引導 今天我們進入鏈表的學習&#xff0c;我相信大家對鏈表都很熟悉。鏈表和數組一樣&#xff0c;作為最基礎的數據結構。在我們的工作中常常會使用到。但是我們真的了解到數組和鏈表的區別嗎&#xff1f;什么時候使用數組&#xff0c;什么時候使用鏈表&#xff0c;能夠正確的選…

監控員工上網有什么軟件

監控員工上網的軟件主要用于監控員工在工作時間內的網絡行為&#xff0c;包括瀏覽網頁、使用社交媒體、發送郵件等。通過監控員工上網行為&#xff0c;企業管理者可以更好地了解員工的工作狀態和行為&#xff0c;規范員工的上網行為&#xff0c;提高工作效率&#xff0c;同時也…

SSL證書對網站的作用及影響?

SSL證書作為當下互聯網的重要安全件&#xff0c;包括搜索引擎的收錄、網站是否具備信任的條件以及HTTP2.0傳輸協議的相互作用等&#xff0c;尤其是瀏覽器對古老的http協議警告提示不安全將直接影響到用戶的信任度以及品牌形象&#xff0c;對于網站來說可謂是必不可少。 SSL證書…

Webstorm 插件文件目錄顏色分析——白藍綠紅黃灰

Webstorm 插件文件目錄【白色、藍色、綠色、紅色、黃色、灰色】對應當前文件發生什么了&#xff0c;即文件夾當前狀態。 WebStrom配置好git或SVN后文件顏色代表的含義&#xff1a; 白色&#xff1a;本地無修改內容 藍色&#xff1a;文件內容有修改&#xff0c;暫未提交到git…

python命令行 引導用戶填寫可用的ip地址和端口號

字多不看&#xff0c;直接體驗 待補充 演示代碼 # -*- coding:UTF-8 -*- """ author: dyy contact: douyaoyuan126.com time: 2023/11/23 10:29 file: 引導用戶填寫可用的ip地址和端口號.py desc: xxxxxx """# region 引入必要的依賴 import …

C語言-判斷上三角矩陣

上三角矩陣指主對角線以下的元素都為0的矩陣&#xff1b;主對角線為從矩陣的左上角至右下角的連線。 本題要求編寫程序&#xff0c;判斷一個給定的方陣是否上三角矩陣。 輸入格式&#xff1a; 輸入第一行給出一個正整數T&#xff0c;為待測矩陣的個數。接下來給出T個矩陣的信…

【LeetCode:2304. 網格中的最小路徑代價 | dijkstra(迪杰斯特拉)】

&#x1f680; 算法題 &#x1f680; &#x1f332; 算法刷題專欄 | 面試必備算法 | 面試高頻算法 &#x1f340; &#x1f332; 越難的東西,越要努力堅持&#xff0c;因為它具有很高的價值&#xff0c;算法就是這樣? &#x1f332; 作者簡介&#xff1a;碩風和煒&#xff0c;…

Vue中使用Echarts實現數據可視化

文章目錄 引言一、安裝Echarts二、引入Echarts三、創建圖表容器四、初始化Echarts實例五、配置圖表選項和數據六、實現圖表更新七、Vue實例代碼結語我是將軍&#xff0c;我一直都在&#xff0c;。&#xff01; 引言 接著上一篇內容&#xff0c;我將繼續分享有關數據可視化的相…

Bellman-Ford算法

初步了解 Bellman-Ford算法是一種用于尋找帶有負權邊的圖中的單源最短路徑的算法。它可以處理一般的圖&#xff0c;包括存在負權邊和負權環的情況。 以下是Bellman-Ford算法的基本思想和步驟&#xff1a; 初始化&#xff1a;將源節點的距離設置為0&#xff0c;將所有其他節點…

Hook+jsdom 解決cookie逆向

前言 記錄下如何破cookie逆向 目標 目標網址:https://q.10jqka.com.cn/ 目標接口:http://q.10jqka.com.cn/index/index/board/all/field/zdf/order/desc/page/2/ajax/1/ 對抗:cookie反爬蟲處理,關鍵字v,如圖 解決步驟 1、JS中關鍵字查找 如上,我們找到了關鍵字 v,…

為何設計師都在用這個原型樣機資源網站?

談論原型樣機素材模板&#xff0c;這個話題對設計師來說如同老朋友一般熟悉。設計師們在創作完畢后&#xff0c;為了更淋漓盡致地展示他們的設計成果&#xff0c;通常會將其放置在真實的樣機素材模板中。這種原型樣機素材可以讓設計作品迅速且清晰地呈現在真實環境中。找到一個…

(5秒解決)ImportError: attempted relative import with no known parent package

尋找了很多方法&#xff0c;發現大家把事情講的復雜了。我這里用最簡單的辦法來解決父包引用找不到的問題。 報錯提示&#xff1a;ImportError: attempted relative import with no known parent package 先給大家看看我的目錄結構&#xff0c;model.py和test目錄在同一級。tra…