(七)趣學設計模式 之 適配器模式!

在這里插入圖片描述

目錄

    • 一、 啥是適配器模式?
    • 二、 為什么要用適配器模式?
    • 三、 適配器模式的實現方式
      • 1. 類適配器模式(繼承插座 👨?👩?👧?👦)
      • 2. 對象適配器模式(插座轉換器 🔌)
      • 3. 接口適配器模式(萬能插座 🗜?)
    • 四、 三種適配器的對比
    • 五、 適配器模式的優缺點
    • 六、 適配器模式的應用場景
    • 七、 總結

🌟我的其他文章也講解的比較有趣😁,如果喜歡博主的講解方式,可以多多支持一下,感謝🤗!
🌟了解代理模式請看: (六)趣學設計模式 之 代理模式!

這篇文章帶你詳細認識一下設計模式中的適配器模式

一、 啥是適配器模式?

想象一下,你買了一個新的電器 💡,但是插頭和家里的插座不匹配 😫,怎么辦? 這時候就需要一個插座轉換器 🔌,把電器的插頭轉換成家里的插座可以使用的類型 💡。

適配器模式,就是用來解決接口不兼容的問題! 它可以將一個類的接口轉換成客戶希望的另外一個接口,使得原本由于接口不兼容而不能一起工作的那些類可以一起工作 🤝。

簡單來說,就是把不兼容的接口轉換成兼容的接口!

  • 你想使用一個類,但是它的接口和你需要的接口不一樣: 就像你想用一個舊的類庫,但是它的接口和你的代碼不兼容 😫!
  • 你想讓兩個接口不兼容的類一起工作: 就像你想讓一個美國的插頭和一個中國的插座一起工作 🔌!
  • 你想重用一些現有的類,但是它們的接口不符合你的要求: 就像你想用一個舊的算法,但是它的輸入輸出格式和你的代碼不兼容 😫!

二、 為什么要用適配器模式?

用適配器模式,好處多多 👍:

  • 提高類的復用性: 可以將一些現有的類適配成新的接口,方便重用 ??!
  • 提高系統的靈活性: 可以動態地選擇不同的適配器,使得系統更加靈活 🤸!
  • 符合開閉原則: 可以在不修改現有代碼的情況下,增加新的適配器,擴展功能 🆕!
  • 解耦: 將客戶端和目標類解耦,降低系統的耦合度 🔗!

三、 適配器模式的實現方式

適配器模式主要分為三種:

  • 類適配器模式: 通過繼承來實現適配,就像繼承了插座的類 👨?👩?👧?👦!
  • 對象適配器模式: 通過組合來實現適配,就像用一個插座轉換器 🔌!
  • 接口適配器模式: 通過實現一個抽象類來實現適配,就像萬能插座 🗜?!

1. 類適配器模式(繼承插座 👨?👩?👧?👦)

類適配器模式,通過繼承來實現適配,就像繼承了插座的類,擁有了插座的功能 🔌!

案例:電壓適配器(經典案例 ?)

假設你有一個 220V 的電源 🔌,但是你需要給一個 5V 的設備充電 📱,怎么辦? 這時候就需要一個電壓適配器,把 220V 的電壓轉換成 5V 的電壓 ?!

代碼示例:

// 目標接口:5V 電壓
public interface Voltage5V {int output5V(); // 輸出 5V 電壓
}// 需要適配的類:220V 電壓
public class Voltage220V {public int output220V() {int src = 220;System.out.println("我是220V電壓");return src;}
}// 適配器類:電壓適配器
public class VoltageAdapter extends Voltage220V implements Voltage5V {@Overridepublic int output5V() {// 獲取 220V 電壓int srcV = output220V();// 轉換成 5V 電壓int dstV = srcV / 44;return dstV;}
}// 客戶端
public class Client {public static void main(String[] args) {VoltageAdapter adapter = new VoltageAdapter(); // 創建適配器對象int voltage = adapter.output5V(); // 獲取 5V 電壓System.out.println("輸出電壓為:" + voltage + "V"); // 輸出電壓}
}

分析:

  • Voltage5V 是目標接口,客戶端需要使用 5V 電壓。
  • Voltage220V 是需要適配的類,它只能輸出 220V 電壓。
  • VoltageAdapter 是適配器類,它繼承了 Voltage220V 類,并實現了 Voltage5V 接口,將 220V 電壓轉換成 5V 電壓。

輸出結果:

我是220V電壓
輸出電壓為:5V

2. 對象適配器模式(插座轉換器 🔌)

對象適配器模式,通過組合來實現適配,就像用一個插座轉換器,把電器的插頭轉換成家里的插座可以使用的類型 🔌!

案例:還是電壓適配器(對象版?)

還是上面的電壓適配器的例子,但是這次我們使用對象適配器模式來實現 🚀!

代碼示例:

// 目標接口:5V 電壓
public interface Voltage5V {int output5V(); // 輸出 5V 電壓
}// 需要適配的類:220V 電壓
public class Voltage220V {public int output220V() {int src = 220;System.out.println("我是220V電壓");return src;}
}// 適配器類:電壓適配器
public class VoltageAdapter implements Voltage5V {private Voltage220V voltage220V; // 組合 220V 電壓對象public VoltageAdapter(Voltage220V voltage220V) {this.voltage220V = voltage220V;}@Overridepublic int output5V() {// 獲取 220V 電壓int srcV = voltage220V.output220V();// 轉換成 5V 電壓int dstV = srcV / 44;return dstV;}
}// 客戶端
public class Client {public static void main(String[] args) {Voltage220V voltage220V = new Voltage220V(); // 創建 220V 電壓對象VoltageAdapter adapter = new VoltageAdapter(voltage220V); // 創建適配器對象int voltage = adapter.output5V(); // 獲取 5V 電壓System.out.println("輸出電壓為:" + voltage + "V"); // 輸出電壓}
}

分析:

  • Voltage5V 是目標接口,客戶端需要使用 5V 電壓。
  • Voltage220V 是需要適配的類,它只能輸出 220V 電壓。
  • VoltageAdapter 是適配器類,它組合了 Voltage220V 類,并實現了 Voltage5V 接口,將 220V 電壓轉換成 5V 電壓。

輸出結果:

我是220V電壓
輸出電壓為:5V

3. 接口適配器模式(萬能插座 🗜?)

接口適配器模式,通過實現一個抽象類來實現適配,就像萬能插座,可以兼容各種類型的插頭 🗜?!

案例:USB 接口適配器(萬能接口 💻)

假設你有一個 USB 設備 💾,但是你的電腦只有 Type-C 接口 💻,怎么辦? 這時候就需要一個 USB 接口適配器,把 USB 接口轉換成 Type-C 接口 💻!

代碼示例:

// 目標接口:USB 接口
public interface Usb {void read(); // 讀取數據void write(); // 寫入數據void connect(); // 連接設備void disconnect(); // 斷開連接
}// 抽象適配器類:USB 適配器
public abstract class UsbAdapter implements Usb {@Overridepublic void read() {// 默認實現,可以不實現}@Overridepublic void write() {// 默認實現,可以不實現}@Overridepublic void connect() {// 默認實現,可以不實現}@Overridepublic void disconnect() {// 默認實現,可以不實現}
}// 需要適配的類:Type-C 設備
public class TypeCDevice extends UsbAdapter {@Overridepublic void read() {System.out.println("Type-C 設備讀取數據");}@Overridepublic void write() {System.out.println("Type-C 設備寫入數據");}
}// 客戶端
public class Client {public static void main(String[] args) {TypeCDevice typeCDevice = new TypeCDevice(); // 創建 Type-C 設備對象typeCDevice.connect(); // 連接設備typeCDevice.read(); // 讀取數據typeCDevice.write(); // 寫入數據typeCDevice.disconnect(); // 斷開連接}
}

分析:

  • Usb 是目標接口,客戶端需要使用 USB 接口。
  • UsbAdapter 是抽象適配器類,它實現了 Usb 接口,但是提供了默認實現,子類可以選擇性地實現需要的方法。
  • TypeCDevice 是需要適配的類,它繼承了 UsbAdapter 類,并實現了 readwrite 方法,實現了 USB 接口的功能。

輸出結果:

Type-C 設備讀取數據
Type-C 設備寫入數據

四、 三種適配器的對比

特性類適配器模式對象適配器模式接口適配器模式
實現方式繼承組合抽象類
優點簡單易用靈活,可以適配多個類可以選擇性地實現接口方法
缺點只能適配一個類,耦合度較高需要持有目標類的對象,增加了對象的數量需要定義抽象類,增加了類的數量
適用場景目標類接口比較穩定,不需要經常修改需要適配多個類,或者目標類接口經常修改只需要使用接口中的部分方法

五、 適配器模式的優缺點

優點:

  • 提高類的復用性 ??!
  • 提高系統的靈活性 🤸!
  • 符合開閉原則 🆕!
  • 解耦 🔗!

缺點:

  • 增加了系統的復雜度 😫!
  • 可能會降低性能 🐌!

六、 適配器模式的應用場景

  • 接口轉換: 將一個類的接口轉換成客戶希望的另外一個接口 🔌!
  • 數據轉換: 將一種格式的數據轉換成另外一種格式的數據 🗂?!
  • 遺留系統集成: 將新的系統和舊的系統集成在一起 🤝!
  • 第三方庫集成: 將第三方庫集成到你的項目中 📚!

七、 總結

  • 適配器模式就像插座轉換器,讓不兼容的接口也能愉快玩耍! 🔌
  • 主要分為類適配器模式、對象適配器模式和接口適配器模式三種! 🤸
  • 優點是提高類的復用性、提高系統的靈活性、符合開閉原則、解耦! 👍
  • 缺點是增加復雜度、可能降低性能! 👎
  • 適用于需要解決接口不兼容的問題的場景! 🎯

希望這篇文章能讓你徹底理解適配器模式! 💯 祝你學習愉快! 😄
看完請看:(八)趣學設計模式 之 裝飾器模式!

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

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

相關文章

【Java基礎】Java中new一個對象時,JVM到底做了什么?

Java中new一個對象時,JVM到底做了什么? 在Java編程中,new關鍵字是我們創建對象的最常用方式。但你是否想過,當你寫下new MyClass()時,Java虛擬機(JVM)到底在背后做了哪些工作?今天&…

內網穿透:打破網絡限制的利器

目錄 深入理解內網穿透 內網與外網的奧秘 內網穿透的原理剖析 總結與展望 在如今這個數字化時代,網絡已經成為我們生活和工作中不可或缺的一部分。但你是否遇到過這樣的困擾:在家辦公時,想要訪問公司內部的文件服務器,卻因為網…

【汽車ECU電控數據管理篇】HEX文件格式解析篇章

一、HEX格式文件是啥 HEX 文件是 Intel 公司提出的一種按地址排列的數據信息格式,通常用于存儲嵌入式系統的二進制代碼。它以 ASCII 碼的形式記錄數據,每一行以冒號開頭,包含數據長度、地址、記錄類型、數據和校驗碼等信息。HEX 文件常用于程…

深入理解 CSS pointer-events: none:穿透點擊的魔法

一、什么是 pointer-events: none? pointer-events: none 是一個強大的 CSS 屬性,它控制元素是否響應鼠標/觸摸事件(如點擊、懸停、拖拽)。當設置為 none 時,元素會變得“透明”,事件會直接穿透到下方的元…

【AHK】資源管理器自動化辦公實例/自動連點設置

此處為一個自動連續點擊打開檢查的自動化操作案例,沒有quicker的鼠鍵錄制,不常用了,做個備份 #MaxThreadsPerHotkey 2 ; 這個是核心!!!!確保可以同時運行多個熱鍵或標簽global isRunning : tru…

html css js網頁制作成品——HTML+CSS甜品店網頁設計(5頁)附源碼

目錄 一、👨?🎓網站題目 二、??網站描述 三、📚網站介紹 四、🌐網站效果 五、🪓 代碼實現 🧱HTML 六、🥇 如何讓學習不再盲目 七、🎁更多干貨 一、👨?&#x1f…

Springboot使用Milvus的基本操作

Milvus 先得保證數據的正確安裝并且正確運行 <dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId> </dependency> <dependency><groupId>io.milvus</groupId><artifactId>milvu…

初階數據結構(C語言實現)——3順序表和鏈表(2)

2.3 數組相關面試題 原地移除數組中所有的元素val&#xff0c;要求時間復雜度為O(N)&#xff0c;空間復雜度為O(1)。OJ鏈接 力扣OJ鏈接-移除元素刪除排序數組中的重復項。力扣OJ鏈接-刪除有序數組中的重復項合并兩個有序數組。力扣OJ鏈接-合并兩個有序數組 2.3.1 移除元素 1…

【力扣】2619. 數組原型對象的最后一個元素——認識原型與原型鏈

【力扣】2619. 數組原型對象的最后一個元素——認識原型與原型鏈 文章目錄 【力扣】2619. 數組原型對象的最后一個元素——認識原型與原型鏈題目解決方案概述全局上下文函數上下文事件處理程序構造函數上下文類上下文顯式 / 隱式綁定綁定方法和永久 this 上下文 方法 1&#xf…

ubuntu終端指令集 shell編程基礎(一)

磁盤指令 連接與查看&#xff1a;磁盤與 Ubuntu 有兩種連接方式&#xff1b;使用ls /dev/sd*查看是否連接成功&#xff0c;通過df系列指令查看磁盤使用信息。若 U 盤已掛載&#xff0c;相關操作可能失敗&#xff0c;需用umount取消掛載。磁盤操作&#xff1a;使用sudo fdisk 磁…

基于Spark的電商供應鏈系統的設計與實現

目錄 1.研究背景與意義 2、國內外研究現狀 3、相關理論與技術 &#xff08;一&#xff09;分布式計算系統Spark &#xff08;二&#xff09;數據倉庫Hive &#xff08;三&#xff09;讀取服務器本地磁盤的日志數據Flume &#xff08;四&#xff09;分布式消息隊列Kafka …

使用TortoiseGit配合BeyondCompare實現在Git倉庫中比對二進制文件

使用TortoiseGit的比對工具可以直接右鍵&#xff0c;點擊選擇比對和上一版本的變化差異&#xff1a; 但是TortoiseGit只能支持比對純文本文件的變化差異&#xff0c;如果嘗試比對二進制文件&#xff0c;會提示這不是一個有效的文本文件&#xff1a; BeyondCompare可以比對二進制…

BladeX框架接口請求跨域

前端使用代理請求接口&#xff0c;接口可以正常訪問。如果換全路徑請求就跨域。 除了后端要配置跨域 還需要修改配置文件對OPTIONS請求的限制

Vue.js響應式基礎

響應式基礎? API 參考 本頁和后面很多頁面中都分別包含了選項式 API 和組合式 API 的示例代碼。現在你選擇的是 組合式 API。你可以使用左側側邊欄頂部的“API 風格偏好”開關在 API 風格之間切換。 聲明響應式狀態? ref()? 在組合式 API 中,推薦使用 ref() 函數來聲明…

選開源CMS建站系統時,插件越多越好嗎?

在選擇開源CMS建站系統時&#xff0c;插件數量并不是唯一的衡量標準&#xff0c;更不能簡單地說“插件越多就越好”&#xff0c;還是需要綜合評估來考慮選擇結果&#xff0c;以下是有關選擇開源CMS系統時對插件數量的考量。 插件數量的優勢插件數量可能帶來的問題功能豐富性&a…

在VSCode中使用MarsCode AI最新版本詳解

如何在VSCode中使用MarsCode AI&#xff1a;最新版本詳解與使用場景 在當今快速發展的軟件開發領域&#xff0c;人工智能&#xff08;AI&#xff09;技術的應用已經變得越來越普遍。ByteDance推出的MarsCode AI是一款強大的AI編程助手&#xff0c;旨在幫助開發者更高效地編寫代…

mac修改docker的daemon.json 鏡像文件

1、找到daemon.json文件的位置 docker info 可以看出位置在&#xff1a; /Users/spuer/.docker 2. 進入daemon.json 所在的目錄&#xff1a; cd /Users/spuer/.docker3. 查看daemon.json的內容&#xff1a; more daemon.json可以看出&#xff0c;沒有配置registry-mirrors&…

5.10 P-Tuning v2:多層級提示編碼的微調革新

P-Tuning v2:多層級提示編碼的微調革新 一、技術架構解析 #mermaid-svg-4Wy6vkXZi67hY9PZ {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-4Wy6vkXZi67hY9PZ .error-icon{fill:#552222;}#mermaid-svg-4Wy6vkXZi67h…

Eclipse 編譯項目指南

Eclipse 編譯項目指南 引言 Eclipse 是一款功能強大的集成開發環境&#xff08;IDE&#xff09;&#xff0c;廣泛用于Java、C/C、Python等多種編程語言的開發。在Eclipse中編譯項目是進行軟件開發的基礎步驟。本文將詳細介紹如何在Eclipse中編譯項目&#xff0c;包括項目設置…

【大語言模型】【整合版】DeepSeek 模型提示詞學習筆記(散裝的可以看我之前的學習筆記,這里只是歸納與總結了一下思路,內容和之前發的差不多)

以下是個人筆記的正文內容: 原文在FlowUs知識庫上&#xff0c;如下截圖。里面內容和這里一樣&#xff0c;知識排版好看一點 一、什么是 DeepSeek 1. DeepSeek 簡介 DeepSeek 是一家專注于通用人工智能&#xff08;AGI&#xff09;的中國科技公司&#xff0c;主攻大模型研發與…