設計模式探索:適配器模式

1. 適配器模式介紹

1.1 適配器模式介紹

適配器模式(adapter pattern)的原始定義是:將一個類的接口轉換為客戶期望的另一個接口,適配器可以讓不兼容的兩個類一起協同工作。

適配器模式的主要作用是把原本不兼容的接口,通過適配修改做到統一,使得用戶方便使用。比如,萬能充電器和多接口數據線都是為了適配各種不同的接口。

在這里插入圖片描述

為什么要轉換接口?

  • 原接口和目標接口都已經存在,不易修改接口代碼。
  • 抽象接口希望復用已有組件的邏輯。
1.2 適配器模式結構

適配器模式(Adapter)包含以下主要角色:

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

適配器模式分為:

  • 類適配器

    在這里插入圖片描述

  • 對象適配器

    在這里插入圖片描述

兩者的區別在于:適配器與適配者的關系。類適配器是繼承關系,對象適配器是聚合關系。根據設計原則,聚合優先于繼承,應多選用對象適配器。

1.3 代碼示例
// 目標接口
public interface Target {void request();
}// 適配者類
public class Adaptee {public void specificRequest() {System.out.println("適配者中的業務代碼被調用!");}
}// 類適配器
public class ClassAdapter extends Adaptee implements Target {@Overridepublic void request() {this.specificRequest();}
}// 對象適配器
public class ObjectAdapter implements Target {private Adaptee adaptee;public ObjectAdapter(Adaptee adaptee) {this.adaptee = adaptee;}@Overridepublic void request() {this.adaptee.specificRequest();}
}// 測試代碼
public class Client {public static void main(String[] args) {Target classAdapter = new ClassAdapter();classAdapter.request();Target objectAdapter = new ObjectAdapter(new Adaptee());objectAdapter.request();}
}

2. 適配器模式在實際開發中的應用

2.1 需求描述

為了提升系統的速度,將一些數據以 K-V 形式緩存在內存中,平臺提供 get、put、remove 等 API 以及相關的管理機制。

功能實現的迭代過程,從 HashMap 到 Memcached 再到 Redis,要確保后面再增加新的緩存組件時,能夠實現自由的切換,并且還要符合開閉原則。

在這里插入圖片描述

設計問題:

  1. 如何在符合開閉原則前提下,實現功能的擴展?
  2. 兩種客戶端 API 不相同,如何保證自由切換?

使用適配器模式。

2.2 功能實現

使用適配器模式將功能相似的多種第三方組件(實現方案),統一成自己需要的 API,業務代碼只依賴已經統一的 API,而不依賴第三方 API。

(1) 定義一個緩存接口,包含 get、put、remove 等操作方法。例如:

public interface Cache {void put(String key, Object value);Object get(String key);void remove(String key);
}

(2) 實現該接口的三個適配器,分別對應 HashMap、Memcached、Redis 三種緩存方案。例如:

// HashMap 適配器
public class HashMapCacheAdapter implements Cache {private Map<String, Object> cache = new HashMap<>();@Overridepublic void put(String key, Object value) {cache.put(key, value);}@Overridepublic Object get(String key) {return cache.get(key);}@Overridepublic void remove(String key) {cache.remove(key);}
}// Memcached 適配器
public class MemcachedCacheAdapter implements Cache {private MemcachedClient memcachedClient;public MemcachedCacheAdapter(MemcachedClient memcachedClient) {this.memcachedClient = memcachedClient;}@Overridepublic void put(String key, Object value) {memcachedClient.set(key, 0, value);}@Overridepublic Object get(String key) {return memcachedClient.get(key);}@Overridepublic void remove(String key) {memcachedClient.delete(key);}
}// Redis 適配器
public class RedisCacheAdapter implements Cache {private Jedis jedis;public RedisCacheAdapter(Jedis jedis) {this.jedis = jedis;}@Overridepublic void put(String key, Object value) {jedis.set(key, value.toString());}@Overridepublic Object get(String key) {return jedis.get(key);}@Overridepublic void remove(String key) {jedis.del(key);}
}

(3) 創建工廠類,根據配置文件中的配置來創建相應的緩存適配器。例如:

public class CacheAdapterFactory {public static Cache createCacheAdapter(String type) {if ("HashMap".equals(type)) {return new HashMapCacheAdapter();} else if ("Memcached".equals(type)) {MemCachedClient memCachedClient = new MemCachedClient();return new MemcachedCacheAdapter(memCachedClient);} else if ("Redis".equals(type)) {Jedis jedis = new Jedis("localhost", 6379);return new RedisCacheAdapter(jedis);} else {throw new IllegalArgumentException("Invalid cache type: " + type);}}
}

使用時,只需要調用工廠類的 createCacheAdapter 方法,傳入緩存類型即可獲取相應的緩存適配器。例如:

public class Client {public static void main(String[] args) {Cache cache = CacheAdapterFactory.createCacheAdapter("Redis");cache.put("key", "value");Object result = cache.get("key");cache.remove("key");}
}

3. 適配器模式總結

優點:

  1. 解耦合: 適配器模式允許兩個沒有直接關聯的類協同工作,降低了它們之間的耦合度。
  2. 提高復用性: 通過適配器,可以重用現有的類,而不需要修改它們的代碼。
  3. 統一接口: 適配器模式提供了一種方法來統一多個不同的接口,使得它們可以被統一對待。
  4. 隱藏實現: 適配器模式隱藏了現有類的實現細節,只暴露出需要的接口。
  5. 靈活性: 可以根據需要自由地適配不同的類,提供了高度的靈活性。

缺點:

  1. 單一適配限制: 使用類適配器時,一次最多只能適配一個適配者類,這可能限制了其應用范圍。
  2. 系統復雜度: 如果過度使用適配器,可能會導致系統結構變得復雜,難以理解和維護。

適用場景:

  1. 接口統一: 當需要統一多個類的接口時,適配器模式可以有效地將它們適配到一個統一的接口。
  2. 兼容性需求: 當現有的接口無法修改,但需要與其他系統或模塊兼容時,適配器模式可以提供解決方案。

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

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

相關文章

【Python_GUI】thinker布局管理——place方法

place方法可以設置組件的大小以及組件在容器中的精確位置&#xff0c;其參數及含義如下&#xff1a; 參數含義X設置組件距離窗口左側的水平距離y設置組件距離窗口頂部的垂直距離width設置組件的寬度height設置組件的高度relx設置組件距離窗口左側的相對距離&#xff0c;范圍為…

c++初階學習----入門(上)

大家好啊。最近學習了一點關于c的知識。這不就迫不及待的來與大家分享了嘛。但我這也是現學現賣所以咧。有很多遺落甚至不對的地方希望大家可以在評論區里面指出來。這樣也可以增加大家對知識的鞏固。 c語言與c的聯系 不知道大家看到c會不會不由自主的聯想到C語言啊。畢竟都是…

手機自帶錄屏在哪?6個軟件教你快速進行手機錄屏

手機自帶錄屏在哪&#xff1f;6個軟件教你快速進行手機錄屏 手機自帶的錄屏功能可以讓你輕松錄制屏幕上的內容&#xff0c;記錄游戲過程、制作教程或捕捉其他重要時刻。不同品牌的手機可能在不同位置提供錄屏功能。以下是一些常見的手機品牌及其錄屏功能位置&#xff0c;以及一…

【康復學習--LeetCode每日一題】724. 尋找數組的中心下標

題目&#xff1a; 給你一個整數數組 nums &#xff0c;請計算數組的 中心下標 。 數組 中心下標 是數組的一個下標&#xff0c;其左側所有元素相加的和等于右側所有元素相加的和。 如果中心下標位于數組最左端&#xff0c;那么左側數之和視為 0 &#xff0c;因為在下標的左側不…

運動愛好者的新選擇:哈氪聆光氣傳導耳機,輕巧又安全

平時不管是漫步街頭、騎行穿梭&#xff0c;還是乘坐公共交通時&#xff0c;我總是喜歡佩戴耳機&#xff0c;借此隔絕外部的喧囂&#xff0c;享受音樂的樂趣。在戶外使用耳機&#xff0c;我更傾向于選擇氣傳導耳機&#xff0c;它們更符合我的需求&#xff0c;因為這種耳機能讓我…

優雅下線的藝術:Eureka服務管理深度解析

優雅下線的藝術&#xff1a;Eureka服務管理深度解析 引言 在微服務架構中&#xff0c;服務的動態注冊與發現是保證系統高可用性的關鍵。Eureka作為Netflix開源的服務發現框架&#xff0c;提供了服務注冊與發現的基本功能。然而&#xff0c;服務在下線時如何做到"優雅&qu…

每日一編程,早點拿offer

計算字符串最后一個單詞的長度&#xff0c;單詞以空格隔開 輸入描述&#xff1a; 輸入一行&#xff0c;代表要計算的字符串&#xff0c;非空 輸出描述&#xff1a; 輸出一個整數&#xff0c;表示輸入字符串最后一個單詞的長度。 輸入&#xff1a;hello world輸出&#xff1a…

kubernetes集群證書過期問題解決

kubernetes集群證書過期問題解決 問題描述檢查證書是否過期更新證書master節點操作node節點操作 問題描述 K8S 各個組件需要與 api-server 進行通信&#xff0c;通信使用的證書都存放在 /etc/kubernetes/pki 路徑下&#xff0c;kubeadm 生成的證書大部分默認有效期為 1 年&…

SECS/GEM快速完成半導體設備通訊

金南瓜幫助國內大量從事半導體前道設備開發研制、生產的設備廠商&#xff0c;通過快速提供穩定可靠的SECS/GEM、GEM300產品&#xff0c;為客戶在激光退火、濕法設備&#xff08;清洗、鍍膜等&#xff09;、離子注入、MOCVD、PVD等客戶專注于核心工藝提升&#xff0c;提升企業的…

`CyclicBarrier` 是 Java 中的一個同步輔助工具類,它允許一組線程相互等待,直到所有線程都達到了某個公共屏障點(barrier point)

CyclicBarrier 是 Java 中的一個同步輔助工具類&#xff0c;它允許一組線程相互等待&#xff0c;直到所有線程都達到了某個公共屏障點&#xff08;barrier point&#xff09;。當所有線程都到達屏障點時&#xff0c;它們可以繼續執行后續操作。CyclicBarrier 的特點是可以重復使…

中介子方程五十

XXFXXaXnXaXXαXLXyXXWXuXeXKXXiXyXΣXXΣXXVXuXhXXWXηXXiXhXXpXXhXiXXηXWXXhXuXVXXΣXXΣXyXiXXKXeXuXWXXyXLXαXXaXnXaXXFXXaXnXaXXαXLXyXXWXuXeXKXXiXyXΣXXΣXXVXuXhXXWXηXXiXhXXpXXhXiXXηXWXXhXuXVXXΣXXΣXyXiXXKXeXuXWXXyXLXαXXaXnXaXXFXXuXXWXXuXXdXXrXXαXXuXpX…

Gen4Gen:多概念個性化圖像生成的數據驅動革新

個性化文本到圖像生成模型在用戶控制生成過程方面取得了重要進展。這些模型能夠通過少量訓練樣本學習并合成包含新穎個性化概念的圖像&#xff0c;例如用戶的寵物或特定物品。然而&#xff0c;現有技術在處理多概念個性化時存在局限性&#xff0c;尤其是在生成包含多個相似概念…

連接與隔離:Facebook在全球化背景下的影響力

在當今全球化的背景下&#xff0c;Facebook作為全球最大的社交網絡平臺&#xff0c;不僅連接了世界各地的人們&#xff0c;還在全球社會、經濟和文化中發揮著深遠的影響。本文將深入探討Facebook在全球化進程中的作用&#xff0c;以及其對個體和社會之間連接與隔離的雙重影響。…

【續集】Java之父的退休之旅:從軟件殿堂到多彩人生的探索

Java之父的退休之旅&#xff1a;從軟件殿堂到多彩人生的探索-CSDN博客 四、科技領袖退休后的行業影響 4.1 傳承與啟迪 Gosling等科技領袖的退休&#xff0c;為行業內部年輕一代提供了更多的發展機會和成長空間。他們的退休不僅意味著權力和責任的交接&#xff0c;更是一種精…

等保測評新趨勢:應對數字化轉型中的安全挑戰

隨著信息技術的飛速發展&#xff0c;數字化轉型已成為企業提升競爭力、優化運營效率的重要手段。然而&#xff0c;這一轉型過程中&#xff0c;企業也面臨著前所未有的安全挑戰。等保測評&#xff08;信息安全等級保護測評&#xff09;作為保障信息系統安全的重要手段&#xff0…

html5路由如何在nginx上部署(vite+vue3)

我們知道前端常用的有Hash 模式和html5模式的路由&#xff0c;hash模式在nginx上部署不需要額外的操作&#xff0c;而html5模式則需要額外設置&#xff0c;這里介紹下如何在nginx根地址&#xff08;location / {}&#xff09;下部署和在非根地址上&#xff08;location /admin{…

【MATLAB源碼-第232期】基于matlab的 (204,188) RS編碼解碼仿真,采用QPSK調制輸出誤碼率曲線。

操作環境&#xff1a; MATLAB 2022a 1、算法描述 Reed-Solomon碼&#xff08;RS碼&#xff09;是一類廣泛應用于數字通信和存儲系統中的糾錯碼&#xff0c;尤其在光盤、衛星通信和QR碼等領域有著重要作用。RS碼是一種非二進制的糾刪碼&#xff0c;由Irving S. Reed和Gustave…

當CNN遇上Mamba,高性能與高效率通通拿下!

傳統視覺模型在處理大規模或高分辨率圖像時存在一定限制&#xff0c;為解決這個問題&#xff0c;研究者們就最近依舊火熱的Mamba&#xff0c;提出了Mamba結合CNN的策略。 這種結合可以讓Mamba在處理長序列數據時既能夠捕捉到序列中的時間依賴關系&#xff0c;又能夠利用CNN的局…

思維+并查集,1670C - Where is the Pizza?

一、題目 1、題目描述 2、輸入輸出 2.1輸入 2.2輸出 3、原題鏈接 1670C - Where is the Pizza? 二、解題報告 1、思路分析 考慮兩個數組a&#xff0c;b的每個位置只能從a&#xff0c;b中挑一個 不妨記posa[x]為x在a中位置&#xff0c;posb同理 我們假如位置i挑選a[i]&a…

【JS+H5+CSS實現煙花特效】

話不多說直接上代碼 注意:背景圖路徑是picture/star.jpg&#xff0c;自己在同級目錄先創鍵picture目錄再下載一張圖片命名為star.jpg HTML: <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"vi…