設計模式12-適配器模式

定義

? ? ? ? Adapter Partern:?將一個類的接口變換成客戶端所期待的另一種接口,從而使原本因接口不匹配而無法在一起工作的兩個類能夠在一起工作。

場景

  1. 系統需要使用現有的類,而這些類的接口不符合系統的需要。

    • 典型場景:集成第三方庫、遺留系統代碼或外部組件。你不想(或不能)修改別人的代碼,但你的系統接口標準又和它們不一樣。

  2. 想要建立一個可以重復使用的類,用于與一些彼此之間沒有太大關聯的類(包括可能在將來引進的類)一起工作。

    • 適配器可以作為一個中間層,將未來可能引入的新組件也適配到現有系統中。

  3. 需要一個統一的輸出接口,而輸入端的類型不可預知或多樣化。

    • 例如,一個文件處理器可能需要處理來自磁盤、網絡、數據庫等各種來源的數據,但它們提供的讀取接口各不相同。可以為每種來源創建一個適配器,讓處理器用統一的接口讀取數據。

Java場景

  1. Java IO 流

    • InputStreamReader?和?OutputStreamWriter?就是經典的適配器。

    • InputStreamReader?將基于字節的?InputStream?適配為基于字符的?Reader?接口。

    • java.io.InputStreamReader(InputStream in)?// 適配器構造函數,接收一個InputStream

    • java.io.OutputStreamWriter(OutputStream out)?// 適配器構造函數,接收一個OutputStream

  2. Java 集合框架

    • Arrays.asList(T[] a)?方法將一個數組適配成一個?List?接口。你不能再添加或刪除元素,但可以使用?List?的所有其他方法來操作數組元素。

  3. Java AWT / Swing 事件處理

    • 早期常用WindowAdapter等適配器類(通常是抽象類,提供空實現)。它們是為了簡化事件監聽器接口的創建,屬于一種“缺省適配器”模式,是適配器模式的一種變體。

    • 例如,MouseAdapter?實現了?MouseListener?接口,但所有方法都是空實現。你可以只重寫你關心的?mouseClicked?方法,而不必實現所有5個方法。

  4. Spring Framework

    • Spring MVC 中的?HandlerAdapter?是核心組件之一。DispatcherServlet 并不直接處理各種Controller(如?@Controller,?HttpRequestHandler,?Controller?接口實現類等),而是通過?HandlerAdapter?來調用。不同的Controller由不同的適配器來處理,從而屏蔽了Controller的多樣性。

代碼

// 1. 目標接口 (Target Interface) - 美標插座
interface ISocket {void supplyPower(); // 提供電力
}// 2. 被適配者 (Adaptee) - 中標插頭
class ChinesePlug {public void connect() {System.out.println("中國插頭已連接,開始供電...");}
}// 3. 適配器 (Adapter) - 轉換插頭 (對象適配器,使用組合)
class SocketAdapter implements ISocket {// 持有被適配對象的引用private ChinesePlug chinesePlug;public SocketAdapter(ChinesePlug chinesePlug) {this.chinesePlug = chinesePlug;}@Overridepublic void supplyPower() {// 調用被適配對象的方法,進行轉換System.out.print("[適配器工作] 將美標接口轉換為中標接口 -> ");chinesePlug.connect(); // 本質調用的是被適配的方法}
}// 4. 客戶端 (Client)class AdapterPatternDemo {public static void main(String[] args) {// 我有一個中標插頭的電器ChinesePlug myPlug = new ChinesePlug();// 我在美國,墻上只有美標插座(ISocket),插不進去// 我買了一個轉換插頭(適配器)ISocket adapter = new SocketAdapter(myPlug);// 現在我可以把轉換插頭插到墻上的美標插座了// 客戶端始終只和目標接口ISocket打交道adapter.supplyPower();}
}

適配器模式代碼

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

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

相關文章

VGG改進(6):基于PyTorch的VGG16-SE網絡實戰

1. 引言:注意力機制在計算機視覺中的重要性近年來,深度學習在計算機視覺領域取得了巨大成功,從圖像分類到目標檢測,各種復雜任務都獲得了前所未有的性能提升。然而,傳統的卷積神經網絡(CNN)在處…

[電商網站-動態渲染商品-尺寸、尺碼、顏色圖片等];庫存缺貨狀態動態對應。

目錄 描述: 數據結構 組件代碼文件 描述: 自動處理SKU數據生成規格屬性列表 支持用戶選擇不同規格組合 智能禁用無庫存選項 自動匹配當前選擇對應的SKU信息 通過視覺樣式區分可選/不可選狀態 該組件采用Vue實現,通過計算屬性和響應式數據…

論《運動戰》

運動戰的本質是以機動換主動,以時間換空間,通過高度的流動性、主動的位移和靈活的戰術選擇,在動態中創造并捕捉戰機,最終以較小的代價換取最大的勝利。它是一種非對稱的、主動的作戰哲學,其核心不在于一城一地的得失&a…

DVWA靶場通關筆記-CSRF(Impossible級別)

目錄 一、查看源碼 二、功能分析 三、CSRF防范分析 1、CSRF令牌驗證機制 (1)核心原理 (2)防范機制 2、舊密碼確認防御實現 (1)核心原理 (2)為什么舊密碼確認能有效防范CSRF…

深層語義在自然語言處理中的理論框架與技術融合研究

摘要本文章系統闡述了深層語義在自然語言處理(NLP)領域的定義、特征及其與知識圖譜和大型預訓練語言模型的融合方法。基于截至2025年8月的最新研究成果,報告深入分析了深層語義的多維度特性、技術實現路徑以及面臨的挑戰,為研究人…

深入解析HarmonyOS:UIAbility與Page的生命周期協同

深入解析HarmonyOS:UIAbility與Page的生命周期協同 在HarmonyOS應用開發中,理解UIAbility和Page的生命周期是構建高質量應用的關鍵。本文將深入探討這兩大核心概念的生命周期及其協同工作機制,幫助開發者更好地管理應用資源、優化用戶體驗。…

規律作息 + 養成好的習慣 + 考研倒計時 111 天 + 線面積分入門 1 下半部分

文章目錄前言雜進度10.4空間直線一般式方程對稱式方程 點向式方程參數式方程轉換位置關系10.510.610.7平面束方程10.810.9總結前言 規律作息! 雜 欲買桂花同載酒,終不似,少年游。 進度 向量代數和空間解析幾何。 10.4 這題就是算一個…

序列容器(vector,deque,list)

STL 序列式容器(vector、deque、list、array、forward_list)的核心特征是按插入順序存儲元素(元素的邏輯順序與物理存儲順序一致) vector 下圖是底層原理 具體點擊鏈接vector介紹 deque(雙端隊列) 在 C STL 中,deque…

Time-MOE添加MLP分類頭進行分類任務

文章目錄一、背景:Time-MoE 的 4096 長度限制二、數據準備(以帕金森二分類為例)三、標簽對齊(弱監督)四、類別不平衡 & 數據劃分五、模型微調(凍結 backbone,只訓 MLP 頭)六、評…

樸素貝葉斯:用 “概率思維” 解決分類問題的經典算法

一、貝葉斯:從 “逆概” 問題走來的數學家要理解樸素貝葉斯,得先回到它的 “源頭”—— 貝葉斯公式,以及它要解決的核心問題:逆概問題。1. 貝葉斯的 “生不逢時”托馬斯?貝葉斯(Thomas Bayes,約 1701-1761…

Qt/C++開發監控GB28181系統/視頻點播主碼流子碼流/動態切換碼流/支持海康大華/全網唯一

一、前言說明 目前市面上的國標監控系統,沒有看到可以切換碼流的,都是默認主碼流,包括easynvr、livegbs、wvp等,很是奇怪為什么他們不做呢?難道沒有用戶反饋需要這個?我這就遇到過一些用戶需要能夠切換主碼…

【 MYSQL | 基礎篇 四大SQL語句 】資料位于文章末尾

摘要:本文先介紹數據庫 SQL 的核心概念,接著闡述 SQL 通用語法與 DDL、DML、DQL、DCL 四大分類,隨后詳細講解各類語句操作,包括 DDL 的數據庫與表操作及數據類型,DML 的數據增刪改,DQL 的查詢語法與功能&am…

Webrtc支持FFMPEG硬解碼之Intel

Intel QSV下載編譯git clone https://github.com/lu-zero/mfx_dispatch.git1.使用CMake生產VS工程編譯生成libmfx.lib文件 頭文件為mfx文件夾libmfx---include---mfx---lib---libmfx.libWebrtc中ffmpeg的修改因為Webrtc中的ffmpeg是使用gn進行編譯的,所以這里先找到…

【二叉樹(DFS) - LeetCode】437. 路徑總和 III

437. 路徑總和 III 題解:DFS /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullp…

【Python】shutil.make_archive() 方法詳解

文章目錄功能概述函數簽名核心參數詳解1. base_name2. format3. root_dir4. base_dir使用示例將 /home/user/project/data 目錄打包為 data.tar.gz,并保存到 /home/user/backups/打包當前工作目錄下的 docs 文件夾為 zip 文件替代方案總結shutil.make_archive() 是 …

CAN總線(Controller Area Network Bus)控制器局域網總線(二)

6、錯誤幀 總線上所有設備都會監督總線的數據,一旦發現“位錯誤”或“填充錯誤”或“CRC錯誤”或“格式錯誤”或“應答錯誤” ,這些設備便會發出錯誤幀來破壞數據,同時終止當前的發送設備。7、過載幀 當接收方收到大量數據而無法處理時&#…

LeetCode 317 離建筑物最近的距離

LeetCode 317 題的詳細題目信息如下:題目名稱Shortest Distance from All Buildings(中文譯名:離建筑物最近的距離)題目描述給你一個由 0、1 和 2 組成的二維網格,其中:0 代表空地1 代表建筑物2 代表障礙物…

AI之CodeTool之Kode:Kode(claude_code風格)的簡介、安裝和使用方法、案例應用之詳細攻略

AI之CodeTool之Kode:Kode(claude_code風格)的簡介、安裝和使用方法、案例應用之詳細攻略 目錄 相關文章 LLMs之PE之SystemPrompt:analysis_claude_code的簡介、使用方法、案例應用之詳細攻略 AI之CodeTool之Kode:Kode(claude_code風格)的簡…

網絡請求優化:用 Retrofit 攔截器玩轉日志、重試與緩存,OkHttp 和 Volley 誰更香?

目錄 1. 攔截器:Retrofit 的“超級管理員” 攔截器的本質 為什么用攔截器? 2. 日志攔截器:讓請求和響應“現原形” 引入日志攔截器 實現日志攔截器 日志輸出示例 生產環境注意事項 3. 重試攔截器:網絡不穩定也能穩如狗 設計重試邏輯 集成到 Retrofit 優化重試策…

LeetCode - 283. 移動零

題目 283. 移動零 - 力扣(LeetCode) 思路 我們使用左右兩個指針:左指針left指向已處理好的非零元素的末尾位置,右指針right用于遍歷數組。 算法步驟: 初始化left為-1(表示還沒有處理任何非零元素&…