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