設計模式——適配器模式

引入實例

說起適配器其實在我們的生活中是非常常見的,比如:學校的宿舍的電壓都比較低,而有的學生想使用大功率電器,宿舍的就會跳閘,然而如果你使用一個適配器(變壓器)就可以使用了(溫馨提示宿舍使用大功率電器不太安全,容易引起火災,希望大家謹慎使用)。

又比如說,有的插座都是三孔的,而我們用的大部分電器是兩孔的,這時我們可以使用一個適配器,適配器本身是三孔的,它可以直接插到三孔的插頭上,適配器本身可以提供一個兩孔的插座,然后我們就可以插到適配器上了,這樣我們原本只能插到兩孔上的插頭就能用三孔的插座了。

適配器模式的相關概念

適配器模式的正式定義

適配器模式(Adapter Pattern)是作為兩個不兼容的接口之間的橋梁。這種類型的設計模式屬于結構型模式,它結合了兩個獨立接口的功能。

適配器模式分為

  • 類適配器模式
  • 對象適配器模式

適配器模式的結構

適配器模式里面總共擁有三個角色,它們分別是:

  • 目標(Target)接口:當前系統業務所期待的接口,它可以是抽象類或接口。
  • 適配者(Adaptee)類:它是被訪問和適配的現存組件庫中的組件接口。
  • 適配器(Adapter)類:它是一個轉換器,通過繼承(類適配器模式)或引用適配者的對象(對象適配器模式),把適配者接口轉換成目標接口(也就是使用轉換器將三頭的插座轉換成適合我們使用的兩頭插座),讓客戶按目標接口的格式訪問適配者。

注意事項:適配器不是在詳細設計時添加的,而是解決正在服役的項目的問題。

類適配器

類適配器的原理就是通過繼承來實現適配器功能。

讓Adapter實現Target接口,并且繼承Adaptee,這樣Adapter就具備Target和Adaptee的特性,就可以將兩者進行轉化。

舉例:以不同設備使用不同交流電為例,通過電源適配器進行轉換說明。

創建目標角色(Target)

public interface Target {int out();
}

創建源角色(Adaptee)

public class Adaptee{public int input() {System.out.println("輸入交流電: 220V");return 220;}
}

創建適配器(Adapter)

public class Adapter extends Adaptee implements Target {@Overridepublic int out() {int input220V = super.input();int output = input220V / 2;System.out.println("輸出交流電: " + output + "V");return output;}
}

客戶端調用

public static void main(String[] args) {Target adapter = new Adapter();int result = adapter.out();System.out.println(result);
}

輸入交流電: 220V
輸出交流電: 110V
110

對象適配器

對象適配器的原理就是通過組合來實現適配器功能。

讓Adapter實現Target接口,然后內部持有Adaptee實例,然后再Target接口規定的方法內轉換Adaptee。

創建目標角色(Target)

public interface Target {int out();
}

創建源角色(Adaptee)

public class Adaptee{public int input() {System.out.println("輸入交流電: 220V");return 220;}
}

創建適配器(Adapter)

public class Adapter implements Target {private Adaptee adaptee;public Adapter(Adaptee adaptee) {this.adaptee = adaptee;}@Overridepublic int out() {int output = adaptee.input() / 2;System.out.println("輸出交流電: " + output + "V");return output;}
}

客戶端調用

    public static void main(String[] args) {Target adapter = new Adapter(new Adaptee());int result = adapter.out();System.out.println(result);}

輸入交流電: 220V
輸出交流電: 110V
110

接口適配器

接口適配器的使用場景是解決接口方法過多,如果直接實現接口,那么類會多出許多空實現的方法,類顯得很臃腫。此時,使用接口適配器就能讓我們只實現我們需要的接口方法,目標更清晰。

接口適配器的主要原理就是原理利用抽象類實現接口,并且空實現接口眾多方法。

創建目標角色(Target)

public interface Target {int out1();int out2();int out3();int out4();
}

創建源角色(Adaptee)

public class Adaptee{public int input() {System.out.println("輸入交流電: 220V");return 220;}
}

創建適配器(Adapter)

public class Adapter implements Target {protected Adaptee adaptee;public Adapter(Adaptee adaptee){this.adaptee = adaptee;}@Overridepublic int out1() {int input220V = adaptee.input();int output = input220V / 1;System.out.println("輸出交流電: " + output + "V");return output;}@Overridepublic int out2() {int input220V = adaptee.input();int output = input220V / 2;System.out.println("輸出交流電: " + output + "V");return output;}@Overridepublic int out3() {return 0;}@Overridepublic int out4() {return 0;}
}

客戶端調用

    public static void main(String[] args) {Target adapter = new Adapter(new Adaptee());adapter.out1();System.out.println("---------------------");adapter.out2();System.out.println("---------------------");Target adapter2 = new Adapter(new Adaptee()) {@Overridepublic int out3() {int input220V = adaptee.input();int output = input220V / 3;System.out.println("輸出交流電: " + output + "V");return output;}};adapter2.out3();System.out.println("---------------------");Target adapter3 = new Adapter(new Adaptee()) {@Overridepublic int out4() {int input220V = adaptee.input();int output = input220V / 4;System.out.println("輸出交流電: " + output + "V");return output;}};adapter3.out4();}

輸入交流電: 220V
輸出交流電: 220V
---------------------
輸入交流電: 220V
輸出交流電: 110V
---------------------
輸入交流電: 220V
輸出交流電: 73V
---------------------
輸入交流電: 220V
輸出交流電: 55V

優缺點

適配器模式優點:

  • 可以讓任何兩個沒有關聯的類一起運行。
  • 提高了類的復用。
  • 增加了類的透明度。
  • 靈活性好。

適配器模式缺點:

  • 過多地使用適配器,會讓系統非常零亂,不易整體進行把握。比如,明明看到調用的是 A 接口,其實內部被適配成了 B 接口的實現,一個系統如果太多出現這種情況,無異于一場災難。因此如果不是很有必要,可以不使用適配器,而是直接對系統進行重構。
  • 由于 JAVA 至多繼承一個類,所以至多只能適配一個適配者類,而且目標類必須是抽象類。

優點 :

  • 類適配器模式優點:由于適配器類是適配者類的子類,因此可以在適配器類中置換一些適配者的方法,使得適配器的靈活性更強。
  • 對象適配器模式優點:一個對象適配器可以把多個不同的適配者適配到同一個目標,也就是說,同一個適配器可以把適配者類和它的子類都適配到目標接口。

缺點:

  • 類適配器模式缺點:對于Java、C#等不支持多重繼承的語言,一次最多只能適配一個適配者類,而且目標抽象類只能為抽象類,不能為具體類,其使用有一定的局限性,不能將一個適配者類和它的子類都適配到目標接口。
  • 對象適配器模式缺點:與類適配器模式相比,要想置換適配者類的方法就不容易。如果一定要置換掉適配者類的一個或多個方法,就只好先做一個適配者類的子類,將適配者類的方法置換掉,然后再把適配者類的子類當做真正的適配者進行適配,實現過程較為復雜。

類適配器和對象適配器的區別:

  • 前者類之間的耦合度比后者高(這是因為類適配器模式使用的是繼承的方式,而對象適配器模式使用的是聚合或者組合的方式)。
  • 類適配器模式要求程序員了解現有組件庫中的相關組件的內部結構,所以應用相對較少些,用的更多的還是對象適配器模式。

應用場景

  1. 當一個系統需要使用另一個系統的接口時,但是兩個系統的接口不兼容,可以使用適配器模式進行接口轉換。
  2. 在數據處理方面,適配器模式可以用于將不同格式的數據適配到一個標準的數據格式上。
  3. 當我們需要復用一些已有的類的時候,這些類的接口與我們需要的接口不兼容,可以使用適配器將這些類的接口轉換成我們需要的接口,從而實現類的復用。
  4. 適配器模式可以用于封裝有缺陷的接口設計,使得客戶可以通過適配器來使用這些缺陷的接口,而無需直接與其交互。
  5. 替換依賴的外部系統,使得系統可以在不修改源代碼的情況下適應新的外部系統。

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

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

相關文章

Jtti:windows虛擬內存最小值太低如何解決

當Windows虛擬內存的最小值設置過低時,可能會導致系統性能下降、應用程序崩潰甚至系統不穩定。解決方法包括: 調整虛擬內存設置: 可以通過以下步驟調整虛擬內存的設置: 右鍵點擊“此電腦”或“計算機”,選擇“屬性”。…

被迫學習一波Linux命令

事情起因 部署一個服務,人家說了最低配置是3G,我沒當回事,拿著個2G的服務器直接就上了,結果,哈哈,都能猜到結果:服務器內存爆了!!!而且最可氣的是服務器還登…

ansible案列之LNMP分布式劇本

LNMP分布式劇本 一:環境設置二:編寫Nginx劇本準備nginx下載源準備配置文件并開放PHP的訪問路徑準備php測試頁面編寫nginx劇本 三:編寫Mysql劇本編寫密碼獲取腳本準備Mysql的yum源編寫mysql劇本 四:準備PHP劇本準備兩個配置文件編寫…

深入理解linux內核--塊設備驅動程序

塊設備的處理 塊設備驅動程序上的每個操作都涉及很多內核組件;其中最重要的一些如圖14-1所示。 例如,我們假設一個進程在某個磁盤文件上發出一個read()系統調用 ——我們將會看到處理write請求本質上采用同樣的方式。 下面是內核對進程請求給予回應的一…

煤礦調度IP語音對講廣播模塊一鍵求助對講礦用調度通信系統SIP語音對講求助終端

硬件接口描述 SV-2101VP/ SV-2103VP系列網絡音頻模塊,所有外部連接采用端子,電源采用2.0mm的端子,網絡采用標準RJ45連接器,其他都是1.25mm的連接器。 端口類型定義 P ———— 電源 AI ———— 模擬輸入(在這里是音…

微信小程序前后端開發快速入門(完結篇)

這篇是微信小程序前后端快速入門完結篇了,今天利用之前學習過的所有知識做一個新的項目「群登記助手v1.0」小程序。 整體技術架構:小程序原生前端小程序云開發。 經歷了前面教程的學習,大家有了一定的基礎,所以本次分享重心主要是…

Ubuntu服務器service版本初始化

下載 下載路徑 官網:https://cn.ubuntu.com/ 下載路徑:https://cn.ubuntu.com/download 服務器:https://cn.ubuntu.com/download/server/step1 點擊下載(22.04.3):https://cn.ubuntu.com/download/server…

【Python百日進階-Web開發-Peewee】Day271 - Peewee API文檔 - 字段(二)

文章目錄 11.3.17 class UUIDField11.3.18 class BinaryUUIDField11.3.19 class DateTimeField11.3.20 class DateField11.3.21 class TimeField11.3.22 class TimestampField11.3.23 class IPField11.3.24 class BooleanField11.3.25 class BareField11.3.26 class ForeignKey…

神經網絡基礎-神經網絡補充概念-06-計算圖

概念 “計算圖”(Computational Graph)是一種用于表示數學表達式計算過程的圖結構,廣泛用于深度學習和自動微分等領域。計算圖將復雜的數學表達式分解為一系列簡單的計算節點,這些節點之間通過邊連接,形成了一個有向無…

【jwt】JWT原理,JWT是用來解決什么問題的,如何自定義生成JWT數據,并且實現jwt數據的解碼

JWT: JSON Web Token 1. jwt概述 用戶登錄成功后,服務端 如何知道客戶端的每次請求對應的是哪個用戶呢?怎么做:目前有兩種方式實現. 1.1. 一是通過sessionId的方式,登錄成功后服務端返回sessionId給客戶端&#xff0…

【2023年11月第四版教材】《第5章-信息系統工程之數據工程(第三部分)》

《第5章-信息系統工程之數據工程(第三部分)》 2 數據工程2.1 數據建模2.2 數據標準化2.3 數據運維2.4 數據開發利用2.5 數據庫安全 2 數據工程 2.1 數據建模 1、根據模型應用目的不同,可以將數據模型劃分為三類:概念模型、邏輯模型和物理模…

【數據結構】棧與隊列

1 棧 1.1 棧的概念及結構 棧:一種特殊的線性表,其只允許在固定的一端進行插入和刪除元素操作。進行數據插入和刪除操作的一端稱為棧頂,另一端稱為棧底。棧中的數據元素遵守后進先出 LIFO (Last In First Out) 的原則。 壓棧:棧…

力扣75——圖廣度優先搜索

總結leetcode75中的圖廣度優先搜索算法題解題思路。 上一篇:力扣75——圖深度優先搜索 力扣75——圖廣度優先搜索 1 迷宮中離入口最近的出口2 腐爛的橘子1-2 解題總結 1 迷宮中離入口最近的出口 題目: 給你一個 m x n 的迷宮矩陣 maze (下標…

Kafka中的 ISR 機制

ISR 是什么 ISR 的全稱叫做: In-Sync Replicas (同步副本集), 可以理解為和 leader 保持同步的所有副本的集合。ISR 動態維護了一個和 leader 副本保持同步副本集合,ISR 中的副本全部都和 leader 的數據保持同步。 設一個場景&a…

JupyterHub實戰應用

一、JupyerHub jupyter notebook 是一個非常有用的工具,我們可以在瀏覽器中任意編輯調試我們的python代碼,并且支持markdown 語法,可以說是科研利器。但是這種情況適合個人使用,也就是jupyter notebook以我們自己的主機作為服務器…

PostgreSQL邏輯備份pg_dump使用及其原理解析

一、原理分析 1、循環調用getopt_long解析命令行參數,將參數保存到static DumpOptions dopt;中 2、判斷參數是否相容,不相容則退出: options -s/--schema-only and -a/--data-only cannot be used togetheroptions -c/--clean and -a/--data…

uni-app中監聽網絡狀態,并在嵌入webView頁面的組件中添加網絡監測

uni-app中監聽網絡狀態,并在嵌入webView頁面的組件中添加網絡監測 uni-app中監聽網絡狀態 下載插件 打開網絡異常組件頁面,點擊"下載插件并導入HBuilderX"按鈕,打開HBuilderX軟件后,選擇需要導入插件的項目&#xff…

機器學習與模型識別1:SVM(支持向量機)

一、簡介 SVM是一種二類分類模型,在特征空間中尋找間隔最大的分離超平面,使得數據得到高效的二分類。 二、SVM損失函數 SVM 的三種損失函數衡量模型的性能。 1. 0-1 損失: 當正例樣本落在 y0 下方則損失為 0,否則損失為…

系統架構設計師-信息安全技術(1)

目錄 一、信息安全基礎 1、信息安全五要素 2、網絡安全漏洞 3、網絡安全威脅 4、安全措施的目標 二、信息加解密技術 1、對稱加密 2、非對稱加密 3、加密算法對比 三、密鑰管理技術 1、數字證書 2、PKI公鑰體系 四、訪問控制技術 1、訪問控制基本模型 2、訪問控制的實現技術…

【Linux命令詳解 | ssh命令】 ssh命令用于遠程登錄到其他計算機,實現安全的遠程管理

文章標題 簡介一,參數列表二,使用介紹1. 連接遠程服務器2. 使用SSH密鑰登錄2.1 生成密鑰對2.2 將公鑰復制到遠程服務器 3. 端口轉發3.1 本地端口轉發3.2 遠程端口轉發 4. X11轉發5. 文件傳輸與遠程命令執行5.1 文件傳輸5.1.1 從本地向遠程傳輸文件5.1.2 …