摘要:組件目標角色客戶端所期待得到的接口,適配器角色適配器類是本模式的核心。最后附上一張適配器的概覽圖參考適配器模式與模式之適配器模式基礎淺談常見設計模式適配器模式原理及實例介紹適配器模式裝飾模式代理模式的異同
適配器模式
說到適配器,小秋第一想到的是我們電腦的電源適配器,它能夠將220v,110v等不同電壓轉換為我們電腦需要的電壓值供電腦使用,那么你知道適配器模式是怎樣實現的嗎,下面就和小秋一起探索一下適配器的工作模式吧
定義將一個類的接口轉換成客戶希望的另一個接口
動機通常情況下,客戶端可以通過目標類的接口訪問它所提供的服務。有時,現有的類可以滿足客戶類的功能需要,但是它所提供的接口不一定是客戶類所期望的,這可能是因為現有類中方法名與目標類中定義的方法名不一致等原因所導致的。
組件目標(Target)角色:客戶端所期待得到的接口,
適配器(Adaper)角色:適配器類是本模式的核心。適配器把源接口轉換成目標接口。顯然,這一角色不可以是接口,而必須是具體類。
源(Adapee)角色被適配者:現在需要被適配的接口
分類 類適配器模式 定義通過多重繼承將apdatee2接口與target接口進行匹配,將適配的類apdatee2的API轉換成為目標類的API
結構 優點適配器可以重定義Adaptee的部分行為,相當于子類覆蓋父類的部分實現方法。
僅僅引入了一個對象,并不需要額外的引用來間接得到Adaptee
缺點由于適配器直接繼承了Adaptee,使得適配器不能和Adaptee的子類一起工作,因為繼承是靜態的關系,當適配器繼承了Adaptee后,就不可能再去處理 Adaptee的子類了
對象的適配器模式 定義被適配的類的API轉換成為目標類的API,與類的適配器模式不同的是,對象的適配器模式不是使用繼承關系連接到Adaptee類而是使用委派關系連接到Adaptee類
結構 優點一個適配器可以把多種不同的源適配到同一個目標。換言之,同一個適配器可以把源類和它的子類都適配到目標接口。因為對象適配器采用的是對象組合的關系,只要對象類型正確,是不是子類都無所謂。
符合設計原則:多用合成/聚合、少用繼承,從而減少類之間的耦合
缺點要重定義Adaptee的行為比較困難,這種情況下,需要定義Adaptee的子類來實現重定義,然后讓適配器組合子類。雖然重定義Adaptee的行為比較困難,但是想要增加一些新的行為則方便的很,而且新增加的行為可同時適用于所有的源
需要額外的引用來間接得到Adaptee。
實現目標接口(客戶端調用的接口)
package adapter; //目標接口(客戶端需要使用的接口) public interface Target { //客戶端需要請求處理的方法 public void request(); }
源接口(需要被適配的接口)
package adapter; //源接口(已經存在的接口) //需要被轉換的對象 //這個接口需要重新配置以適應目標接口 public class Adaptee { public void specifiRequest() { System.out.println("源接口對象調用源接口中的方法"); } }
適配器
package adapter; public class Adapter implements Target { //持有源接口對象 private Adaptee adaptee; /** * 構造方法,傳入需要被適配的對象 * @param adaptee */ public Adapter(Adaptee adaptee) { this.adaptee = adaptee; } /** * 重寫目標接口的方法,以適應客戶端的需求 */ @Override public void request() { //調用源接口的方法 System.out.println("適配器包裝源接口對象,調用源接口的方法"); adaptee.specifiRequest(); } }
客戶端
package adapter; public class Client { public static void main(String[] args){ //創建源對象(被適配的對象) Adaptee adaptee = new Adaptee(); //利用源對象對象一個適配器對象,提供客戶端調用的方法 Adapter adapter = new Adapter(adaptee); System.out.println("客戶端調用適配器中的方法"); adapter.request(); } } //客戶端調用適配器中的方法 //適配器包裝源接口對象,調用源接口的方法 //源接口對象調用源接口中的方法優點
目標類和適配者類解耦,增加了類的透明性和復用性,同時系統的靈活性和擴展性都非常好,更換適配器或者增加新的適配器都非常方便,符合“開閉原則”
缺點過多的使用適配器,會讓系統非常零亂,不易整體進行把握。比如,明明看到調用的是A接口,其實內部被適配成了B接口的實現
應用案例Java語言的數據庫連接工具JDBC,JDBC給出一個客戶端通用的抽象接口,每一個具體數據庫引擎(如SQL Server、Oracle、MySQL等)的JDBC驅動軟件都是一個介于JDBC接口和數據庫引擎接口之間的適配器軟件
應用場景后期維護,由于不同的廠家不同的產品以及不同的開發人員
調用第三方組件
雙方都不太容易修改的時候
用途想要復用一些現有的類,但是接口與復用環境要求不一致
適配器模式與裝飾模式的對比 UML圖適配器模式
裝飾器模式
內容
適配器模式
持有的是待適配的對象,實現的是目標接口,兩個不一樣
擴展了待適配類新的功能
適配器模式拓展了新的功能
裝飾器模式
持有對象和繼承的對象一般是同一個類或接口
裝飾模式中裝飾過的類力求與原來對外接口一致,這使得在調用方看來,裝飾過后的類與之前沒有什么區別,只是某一方面功能增強了
裝飾模式增強了原有功能
總結"裝飾模式與適配器模式是不沖突的,可以既增強原有功能,又添加全新的功能。
最后附上一張適配器的概覽圖
參考適配器模式
《JAVA與模式》之適配器模式
【Java基礎】淺談常見設計模式
適配器模式原理及實例介紹
適配器模式、裝飾模式、代理模式的異同
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/74909.html
摘要:實戰高并發程序設計這本書是目前點評推薦比較多的書,其特色是案例小,好實踐代碼有場景,實用。想要學習多線程的朋友,這本書是我大力推薦的,我的個人博客里面二十多篇的多線程博文都是基于此書,并且在這本書的基礎上進行提煉和總結而寫出來的。 學習的最好途徑就是看書,這是我自己學習并且小有了一定的積累之后的第一體會。個人認為看書有兩點好處:showImg(/img/bVr5S5); 1.能出版出...
摘要:基礎知識復習后端掘金的作用表示靜態修飾符,使用修飾的變量,在中分配內存后一直存在,直到程序退出才釋放空間。將對象編碼為字節流稱之為序列化,反之將字節流重建成對象稱之為反序列化。 Java 學習過程|完整思維導圖 - 后端 - 掘金JVM 1. 內存模型( 內存分為幾部分? 堆溢出、棧溢出原因及實例?線上如何排查?) 2. 類加載機制 3. 垃圾回收 Java基礎 什么是接口?什么是抽象...
摘要:從使用到原理學習線程池關于線程池的使用,及原理分析分析角度新穎面向切面編程的基本用法基于注解的實現在軟件開發中,分散于應用中多出的功能被稱為橫切關注點如事務安全緩存等。 Java 程序媛手把手教你設計模式中的撩妹神技 -- 上篇 遇一人白首,擇一城終老,是多么美好的人生境界,她和他歷經風雨慢慢變老,回首走過的點點滴滴,依然清楚的記得當初愛情萌芽的模樣…… Java 進階面試問題列表 -...
閱讀 3192·2023-04-26 01:39
閱讀 3345·2023-04-25 18:09
閱讀 1612·2021-10-08 10:05
閱讀 3228·2021-09-22 15:45
閱讀 2758·2019-08-30 15:55
閱讀 2393·2019-08-30 15:54
閱讀 3167·2019-08-30 15:53
閱讀 1324·2019-08-29 12:32