溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

“Head First 設(shè)計(jì)模式“ :適配器模式

發(fā)布時間:2020-08-06 18:20:12 來源:網(wǎng)絡(luò) 閱讀:732 作者:u2r2otkit 欄目:軟件技術(shù)

適配器模式


適配器模式定義:將一個類的接口,轉(zhuǎn)化成客戶期望的另一個接口,適配器讓原本接口不兼容的類可以合作無間。對象適配器類圖如下:
“Head First 設(shè)計(jì)模式“ :適配器模式
角色說明
● Target,目標(biāo)接口
● Adapter,適配器
● Adaptee,被適配對象
● Client,客戶端


客戶使用適配器的過程如下
● 客戶通過目標(biāo)接口調(diào)用適配器的方法對適配器發(fā)出請求。
● 適配器使用被適配者接口把請求轉(zhuǎn)換成被適配者的一個或多個調(diào)用接口。
● 客戶接收到調(diào)用的結(jié)果,但并未察覺這一切是適配器在起轉(zhuǎn)換作用。


適配器模式的優(yōu)點(diǎn)
● 將目標(biāo)類和適配者類解耦,通過引入一個適配器類來重用現(xiàn)有的適配者類,無需修改原有結(jié)構(gòu)。
● 增加了類的透明性和復(fù)用性,將具體的業(yè)務(wù)實(shí)現(xiàn)過程封裝在適配者類中,對于客戶端類而言是透明的,而且提高了適配者的復(fù)用性,同一適配者類可以在多個不同的系統(tǒng)中復(fù)用。
● 靈活性和擴(kuò)展性都非常好,通過使用配置文件,可以很方便的更換適配器,也可以在不修改原有代碼的基礎(chǔ)上 增加新的適配器,完全復(fù)合開閉原則。


適配器模式的缺點(diǎn)
● 一次最多只能適配一個適配者類,不能同時適配多個適配者。
● 目標(biāo)抽象類只能為接口,不能為類,其使用有一定的局限性。


適配器模式的使用場景
● 系統(tǒng)需要使用一些現(xiàn)有的類,而這些類的接口不符合系統(tǒng)的需要,甚至沒有這些類的源代碼
● 創(chuàng)建一個可以重復(fù)使用的類,用于和一些彼此之間沒有太大關(guān)聯(lián)的類,包括一些可能在將來引進(jìn)的類一起工作


擴(kuò)展
● 雙向適配器,兩個接口互相轉(zhuǎn)換,省略類圖,說明
● 類適配器,Java不支持多重繼承,所以省略類圖,說明


案例1:假設(shè)已有一個軟件系統(tǒng),你希望它能和一個新的廠商類庫搭配使用,但是這個新的廠商所設(shè)計(jì)出來的接口不同于舊廠商的接口。怎么實(shí)現(xiàn)好,如下:
“Head First 設(shè)計(jì)模式“ :適配器模式
解決辦法,我們不改目前代碼的情況下,加一個適配器(Adapter)類,適配器對用戶來說透明的,如下:

“Head First 設(shè)計(jì)模式“ :適配器模式


案例2:有鴨子接口(鴨子能飛,呱呱叫),火雞接口(可以飛點(diǎn),姑姑叫),假設(shè)我們?nèi)兵喿訉ο?,用火雞來冒充,類圖如下:
“Head First 設(shè)計(jì)模式“ :適配器模式


案例3:JDK中早起版本的Collection集合都實(shí)現(xiàn)了一個elements(),該方法返回一個包含集合里的每一個元素的枚舉,新版本的JDK里用Iterator來代替了,而且Iterator還提供了刪除元素的能力,假設(shè)有一個預(yù)留代碼,這個代碼爆出枚舉接口,但是我們想新代碼中使用迭代器,我們用適配器模式來解決,如下:
“Head First 設(shè)計(jì)模式“ :適配器模式


案例4: JDK里IO框架里的InputStreamReader,OutputStreamReader使用的是適配器模式,如下:
“Head First 設(shè)計(jì)模式“ :適配器模式

說明:
● InputStream,OutputStream是被適配對象。
● Reader,Writer是目標(biāo)接口。
● StreamEncoder是中間類,byte類型轉(zhuǎn)字符時需要編碼轉(zhuǎn)換的,貴類的作用就是這個。
● InputStreamReader,OutputStreamReader是適配器類。


設(shè)計(jì)原則:“最少知識”原則:只和你的密友談話。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI