設計模式精講 Day 6:適配器模式(Adapter Pattern)

【設計模式精講 Day 6】適配器模式(Adapter Pattern)


文章內容

在“設計模式精講”系列的第6天,我們將深入講解適配器模式(Adapter Pattern)。作為結構型設計模式之一,適配器模式的核心思想是將一個類的接口轉換成客戶期望的另一個接口,使得原本不兼容的類可以協同工作。

適配器模式廣泛應用于系統集成、遺留系統改造、第三方庫對接等場景中,尤其在需要兼容不同接口或協議時非常實用。通過本文的學習,你將掌握適配器模式的基本原理、實現方式、適用場景,并了解它在 Java 標準庫和實際項目中的應用。


模式定義

適配器模式是一種結構型設計模式,它通過封裝一個已有對象,使其接口與目標接口兼容,從而允許不兼容的類之間進行協作。

其核心思想是:通過中間層(適配器)將現有類的接口轉換為客戶端所期望的接口。適配器可以是類適配器(繼承方式)或對象適配器(組合方式),具體選擇取決于設計需求。


模式結構

適配器模式的 UML 類圖包含以下幾個關鍵角色:

  • Target(目標接口):客戶端使用的接口。
  • Adaptee(被適配者):已有接口,與目標接口不兼容。
  • Adapter(適配器):實現目標接口,并包裝 Adaptee 實例,使兩者兼容。

文字描述如下:

  1. Target 是客戶端期望使用的接口,通常是一個抽象類或接口。
  2. Adaptee 是已有的類,其接口與 Target 不兼容。
  3. Adapter 是適配器類,它實現了 Target 接口,并內部持有 Adaptee 的引用,通過調用 Adaptee 的方法來滿足 Target 的需求。

適用場景

場景描述
接口不兼容當兩個類的接口不一致,但希望它們能夠協作時。
系統集成在整合多個子系統或第三方服務時,適配器可以統一接口。
遺留系統改造將舊系統接口適配為新系統所需格式,避免大規模重構。
多種數據源支持例如數據庫適配器、文件適配器等,統一訪問不同數據源。

例如,在開發支付系統時,可能需要適配支付寶、微信、銀聯等多個支付平臺的接口,適配器模式可以統一這些接口,簡化客戶端代碼。


實現方式

下面是一個完整的 Java 示例,展示適配器模式的兩種實現方式:類適配器對象適配器

1. 定義目標接口(Target)
// 目標接口:客戶端期望的接口
public interface MediaPlayer {void play(String audioType, String fileName);
}
2. 定義被適配者(Adaptee)
// 被適配者:已有接口,與目標接口不兼容
public class AdvancedMediaPlayer {public void playVlc(String fileName) {System.out.println("播放 VLC 文件: " + fileName);}public void playMp4(String fileName) {System.out.println("播放 MP4 文件: " + fileName);}
}
3. 實現適配器(Adapter)
類適配器(繼承方式)
// 類適配器:繼承 Adaptee 并實現 Target 接口
public class VlcPlayerAdapter extends AdvancedMediaPlayer implements MediaPlayer {@Overridepublic void play(String audioType, String fileName) {if ("vlc".equalsIgnoreCase(audioType)) {playVlc(fileName);} else {System.out.println("不支持的音頻格式: " + audioType);}}
}
對象適配器(組合方式)
// 對象適配器:組合 Adaptee 并實現 Target 接口
public class Mp4PlayerAdapter implements MediaPlayer {private AdvancedMediaPlayer mediaPlayer;public Mp4PlayerAdapter() {this.mediaPlayer = new AdvancedMediaPlayer();}@Overridepublic void play(String audioType, String fileName) {if ("mp4".equalsIgnoreCase(audioType)) {mediaPlayer.playMp4(fileName);} else {System.out.println("不支持的音頻格式: " + audioType);}}
}
4. 客戶端使用示例
public class Client {public static void main(String[] args) {// 使用類適配器MediaPlayer vlcPlayer = new VlcPlayerAdapter();vlcPlayer.play("vlc", "movie.vlc");// 使用對象適配器MediaPlayer mp4Player = new Mp4PlayerAdapter();mp4Player.play("mp4", "video.mp4");}
}

輸出結果:

播放 VLC 文件: movie.vlc
播放 MP4 文件: video.mp4

工作原理

適配器模式的核心機制是接口轉換,即通過適配器將原有類的接口“翻譯”為目標接口。其底層邏輯如下:

  1. 客戶端調用目標接口的方法
  2. 適配器接收到請求后,將其轉發給被適配者的相應方法
  3. 被適配者執行操作并返回結果
  4. 適配器將結果返回給客戶端

這種機制使得客戶端無需關心被適配者的具體實現,只需關注目標接口即可。


優缺點分析

優點缺點
提高系統的兼容性,解決接口不匹配問題增加了系統復雜度,需額外編寫適配器類
降低模塊之間的耦合度過度使用適配器可能導致代碼臃腫
支持多種接口轉換,提高擴展性無法處理所有類型接口的轉換,需按需實現

案例分析:支付系統適配器

假設我們正在開發一個電商平臺,需要集成多個支付平臺(如支付寶、微信、銀聯)。每個平臺的接口都不同,直接調用會增加耦合度,維護成本高。

問題:

  • 各個支付平臺的接口不一致。
  • 客戶端代碼需要針對不同平臺寫不同的調用邏輯。

解決方案:

  • 創建統一的 Payment 接口。
  • 為每個支付平臺實現適配器類,將各自的接口適配為 Payment 接口。
  • 客戶端只需調用 Payment 接口,無需關心具體實現。

代碼示例:

// 統一支付接口
public interface Payment {boolean pay(double amount);
}// 支付寶適配器
public class AlipayAdapter implements Payment {private Alipay alipay;public AlipayAdapter() {this.alipay = new Alipay();}@Overridepublic boolean pay(double amount) {return alipay.processPayment(amount);}
}// 微信支付適配器
public class WeChatPayAdapter implements Payment {private WeChatPay weChatPay;public WeChatPayAdapter() {this.weChatPay = new WeChatPay();}@Overridepublic boolean pay(double amount) {return weChatPay.transfer(amount);}
}

客戶端使用:

public class PaymentClient {public static void main(String[] args) {Payment alipay = new AlipayAdapter();alipay.pay(100.0);Payment wechat = new WeChatPayAdapter();wechat.pay(50.0);}
}

與其他模式的關系

模式關系說明
代理模式兩者都涉及對對象的封裝,但代理模式用于控制訪問,而適配器模式用于接口轉換。
裝飾器模式裝飾器模式用于動態添加功能,而適配器模式用于接口兼容。
橋接模式橋接模式分離抽象與實現,而適配器模式用于接口適配,二者目的不同。

適配器模式常與工廠模式結合使用,用于統一創建不同類型的適配器對象,提升系統靈活性。


總結

適配器模式是一種強大的結構型設計模式,通過接口轉換解決了系統間兼容性問題。它在系統集成、遺留系統改造、第三方庫對接等場景中具有廣泛應用價值。

在本篇文章中,我們詳細介紹了適配器模式的定義、結構、實現方式、工作原理、優缺點以及實際應用場景。通過 Java 代碼示例,我們展示了如何使用類適配器和對象適配器來實現接口轉換,并結合支付系統案例說明其在實際項目中的作用。

下一節我們將進入“設計模式精講”的第7天,講解橋接模式(Bridge Pattern),它是結構型設計模式中的一種,用于解耦抽象與實現,提升系統的可擴展性。


文章標簽

design-patterns, java, software-engineering, oop, object-oriented-programming, adapter-pattern, design-pattern-day6


文章簡述

在“設計模式精講”系列的第6天,我們深入講解了適配器模式(Adapter Pattern),這是一種結構型設計模式,旨在解決接口不兼容的問題。文章從理論到實踐全面解析了該模式的定義、結構、適用場景、實現方式,并結合真實項目案例說明其應用價值。我們通過完整的 Java 代碼示例展示了類適配器和對象適配器的實現方式,并討論了其在支付系統等實際場景中的應用。此外,還分析了適配器模式與其他設計模式的關系,以及其優缺點。通過本文的學習,讀者將掌握如何在實際項目中高效地使用適配器模式,提升系統的兼容性和可維護性。


進一步學習資料

  1. Design Patterns: Elements of Reusable Object-Oriented Software
  2. Java Design Patterns - A Hands-On Guide with Examples
  3. Refactoring Guru - Adapter Pattern
  4. Java 中的適配器模式詳解
  5. Java Design Patterns: Adapter Pattern in Practice

核心設計思想回顧

  • 適配器模式通過接口轉換解決系統間的兼容性問題。
  • 具有類適配器和對象適配器兩種實現方式,可根據需求選擇。
  • 在實際項目中,常用于系統集成、遺留系統改造、多支付平臺對接等場景。
  • 與代理模式、裝飾器模式、橋接模式等有密切關系,可結合使用提升系統靈活性。
  • 適用于接口不一致、需要兼容多個系統或服務的場景。

在實際開發中,合理使用適配器模式可以顯著提升系統的可維護性和擴展性,特別是在面對復雜系統集成時。

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

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

相關文章

系統穩定性治理

一、微服務內部異常 描述 微服務Pod自動重啟表現:服務波動(響應時間不穩定)、監控指標異常(Pod重啟次數增加,CPU/內存波動)、Kubernetes事件記錄容器重啟原因影響:服務中斷、性能波動、資源消耗…

多智能體協同的力量:賦能AI安全報告系統的智能設計之道

“設想一個由‘數據采集者’、‘風險分析師’、‘報告撰寫員’甚至‘合規監督員’組成的虛擬團隊,它們如何攜手打造一份深度洞察、精準預警的危化安全報告?這正是多智能體協作在AI安全領域的魅力所在。” 一、挑戰升級:單一AI難以應對的復雜性…

ceph pg 卡在 active+clean+remapped 狀態

場景 ceph 環境中有個 osd.0 做了 raid0 ,后來想剔除掉,執行了 ceph osd out 0 然后等了很長時間等 pg 數據遷移到別的 osd,但是最后有一個 pg 狀態卡在了 active+clean+remapped 狀態。如下: ceph pg ls-by-osd 0 PG OBJECTS DEGRADED MISPLACED UNFOUND BYTES …

systemd[1]: Failed to start LSB: Bring up/down networking

使用ssh連接虛擬機服務時,連接異常,虛擬機系統centos 7,于是登錄虛擬機,查看服務ip,發現配置的靜態ip未生效。因此重啟網卡systemctl restart network,出現報錯,使用systemctl status network查…

Go 語言使用 excelize 庫操作 Excel 的方法

在筆者開發的項目中,有操作excel的需要,由于go操作excel比較方便且功能強大,于是選擇使用go來操作excel。github.com/360EntSecGroup-Skylar/excelize庫是一個功能強大且易于使用的庫,它支持創建、讀取和修改 Excel 文件&#xff…

Java基礎(三):邏輯運算符詳解

Java基礎系列文章 Java基礎(一):發展史、技術體系與JDK環境配置詳解 Java基礎(二):八種基本數據類型詳解 Java基礎(三):邏輯運算符詳解 目錄 一、什么是邏輯運算符?二、基礎邏輯運算符(3種)1、&&…

Bugku-CTF-web

最近刷了一下 Bugku-CTF-web 的61-70題(平臺目前只有67),好難好難,全都是知識的盲區。各種代碼審計,各種反序列化,各種反彈shell,各種模版注入,各種字符串繞過,可以說是W…

GitLab 工具如何提升我的工作效率

在當今快節奏的軟件開發和技術創作領域,作為一名博主,高效的工作流程和強大的協作工具至關重要。GitLab 作為一款集成了版本控制、項目管理、持續集成與持續部署(CI/CD)等功能于一體的平臺,為我的工作帶來了巨大的便利…

Unity Addressable使用之服務器遠程加載

本地模擬服務器加載 1、創建一個Profiles,將Remote設為Editor Hosted 2、在Addressables Group窗口將Profile設為Local Test 3、將某個Asset Groups設為Remote加載 4、Build資源 5、打開本地模擬服務器 Addressables Hosting 窗口是 Addressable 提供的一個內置本…

Java基礎八股文 - 面試者心理歷程與標準答案

Java基礎八股文 - 面試者心理歷程與標準答案 前言:如何應對Java基礎面試問題 面試Java基礎時,很多候選人會因為緊張而忘記平時熟悉的知識點。本文將從面試者的心理歷程出發,教你如何在面試中用自己的思路組織答案,然后給出標準回…

學習筆記088——Windows配置Tomcat自啟

1、下載 下載Windows版本tomcat。本文下載的版本是: apache-tomcat-9.0.31-windows-x64.zip 點擊下載 注意:要確保bin目錄下有 service.bat 文件! 2、配置服務 解壓后,終端進入bin?錄,安裝服務:service…

SSL證書怎么配置到服務器上 ?

在網絡安全備受關注的當下,SSL證書已成為網站安全的標配。但僅有SSL證書還不夠,正確將其配置到服務器上,才能真正發揮保障數據傳輸安全、驗證網站身份的作用。由于服務器類型多樣,不同服務器的SSL證書配置方法存在差異&#xff0c…

AI與SEO關鍵詞協同進化

內容概要 人工智能(AI)與搜索引擎優化(SEO)的結合,正深刻變革著關鍵詞策略的制定與執行方式。本文旨在探討AI技術如何驅動SEO關鍵詞領域的智能化進化,核心在于利用AI強大的數據處理與模式識別能力&#xf…

01.線性代數是如何將復雜的數據結構轉化為可計算的數學問題,這個過程是如何進行的

將復雜數據結構轉化為可計算的數學問題是數據科學、機器學習和算法設計中的核心環節。這一過程需要結合數據特性、數學理論和計算框架,通過系統化的抽象和建模實現。以下是具體轉化流程及關鍵技術解析: 一、數據結構分析:解構原始數據的本質特征 1. 識別數據類型與結構特性…

華為OD機考-網上商城優惠活動-模擬(JAVA 2025B卷)

import java.util.Scanner;public class Test3 {static int mjq;static int dzq;static int wmkq;static class Group {int price;// 打折后價格int num;// 優惠券使用熟練}public static void main(String[] args) {Scanner scanner new Scanner(System.in);String input sc…

JavaScript 數據處理 - 將字符串按指定位數截斷并放入數組(基礎實現、使用正則表達式實現、使用正則表達式簡化實現)

將字符串按指定位數截斷并放入數組 1、基礎實現 /*** 將字符串按指定位數截斷并放入數組* param {string} str - 要處理的字符串* param {number} n - 每段截斷的位數* returns {Array} 截斷后的字符串數組*/ function splitStringByLength(str, n) {const result [];for (l…

python學智能算法(十四)|機器學習樸素貝葉斯方法進階-CountVectorizer文本處理簡單測試

【1】引用 前序學習文章中,已經對拉普拉斯平滑和簡單二元分類進行了初步探索,相關文章鏈接為: python學智能算法(十二)|機器學習樸素貝葉斯方法初步-拉普拉斯平滑計算條件概率-CSDN博客 python學智能算法&#xff0…

Java枚舉類的規范設計與常見錯誤規避

前言 在Java開發中,枚舉(enum)是一種強大的工具,用于定義一組固定常量集合。然而,許多開發者在使用枚舉時容易陷入設計誤區,導致代碼可維護性差、運行時錯誤頻發,甚至引發生產事故。 一、枚舉…

Vue指令v-if

目錄 一、Vue中的v-if指令是什么?二、v-if指令的使用 一、Vue中的v-if指令是什么? v-if指令是根據表達值的真假,切換元素的顯示和隱藏, 本質是通過操縱dom元素來切換顯示狀態。 注意: 表達式的值為true,元…

探秘阿里云云數據庫Tair:性能、特性與應用全景解析

引言 在數字化浪潮席卷全球的當下,數據已然成為企業最為關鍵的資產之一,如何高效管理和運用這些數據,成為了企業在激烈競爭中脫穎而出的關鍵。云數據庫作為現代數據管理的核心工具,憑借其卓越的可擴展性、靈活性以及高效的數據處…