3分鐘學(xué)設(shè)計模式(結(jié)構(gòu)型):6、適配器模式
前言
設(shè)計模式,是一套被反復(fù)使用、多數(shù)人知曉的、經(jīng)過分類編目的、代碼設(shè)計經(jīng)驗的總結(jié)。它描述了在軟件設(shè)計過程中的一些不斷重復(fù)發(fā)生的問題,以及該問題的解決方案。也就是說,它是解決特定問題的一系列套路,是前輩們的代碼設(shè)計經(jīng)驗的總結(jié),具有一定的普遍性,可以反復(fù)使用。其目的是為了提高代碼的可重用性、代碼的可讀性和代碼的可靠性。
經(jīng)過匯總的23種設(shè)計模式它是總結(jié)了面向?qū)ο?/strong>設(shè)計當(dāng)中最有價值的經(jīng)驗。對之前來講可能是對其中部分設(shè)計模式還是相對來說熟悉的但仔細琢磨還是會有些疑問,正好在目前相對來說有更多的業(yè)余時間,可以來一次重新學(xué)習(xí)設(shè)計模式!
本篇內(nèi)容關(guān)于結(jié)構(gòu)型設(shè)計模式中的適配器模式的設(shè)計與實現(xiàn)。
定義
在計算機編程中,適配器模式(有時候也稱包裝樣式或者包裝)將一個類的接口適配成用戶所期待的。一個適配允許通常因為接口不兼容而不能在一起工作的類工作在一起,做法是將類自己的接口包裹在一個已存在的類中?!俣劝倏?/p>
就是說兩個東西需要交互連接,或者客戶端使用一個產(chǎn)品。但它們兩方接口對不上沒辦法直接使用。這時候需要有一個適配器,讓它們建立連接。適配器包裹產(chǎn)品,客戶端與適配器進行交互。如下圖
type-c與3.5mm的轉(zhuǎn)接器就屬于適配器,它可以說是包裹在耳機上,讓使用的產(chǎn)品(耳機)提供了type-c的頭。也就是讓客戶端手機可以使用,反過來說也可以。
總之是讓客戶端想使用的產(chǎn)品但使用不上的產(chǎn)品,通過包裹適配器之后,客戶端可以通過適配器使用了原先的產(chǎn)品的功能。
實現(xiàn)
先畫個類圖,結(jié)構(gòu)大概如下:

上圖就是一個簡單的設(shè)計結(jié)構(gòu),對于客戶端Client實際上想使用產(chǎn)品Product的功能,但對接不上。中間通過適配器,讓客戶端可以對接到適配器提供的方式,而適配器又能和Product打通。
代碼:
class?Product{
????public?void?specialReceive(){
????????....
????}
}
class?Adapter{
????public?void?receive();
}
class?Mydapter?implements?Adapter{
????private?Product?product;
????public?Mydapter(Product?product){
????????this.product?=?product;
????}
????public?void?receive(){
????????//?可能前后有對結(jié)果數(shù)據(jù)進行格式轉(zhuǎn)換,但絕不影響本身內(nèi)容,只做適配不做增強
????????this.product.specialReceive();
????}
}
class?Client{
????public?void?use(){
????????Adapter?adapter?=?new?Myadapter(new?Adapter());
????????adapter.receive();
????}
}
對于適配器來說并沒有去增強產(chǎn)品的功能,比如只有type-c口的手機使用3.5mm插頭的耳機。通過適配器可以使用上,但使用的就是產(chǎn)品本身的功能,適配器并不做額外的增強。
只是在客戶端與產(chǎn)品可能它是屬于不同的標(biāo)準(zhǔn),無法去直接使用,所以需要通用標(biāo)準(zhǔn)的適配器去接收客戶端標(biāo)準(zhǔn)的內(nèi)容,再按產(chǎn)品的標(biāo)準(zhǔn)讓其可以處理。
它可以適用在一些老舊的庫,現(xiàn)在用新的標(biāo)準(zhǔn)去使用。但這些庫的功能沒必要重寫一個新的庫或者修改原有庫。那么使用適配器是一個很好的選擇。
總結(jié)
適配器模式總體來說是個比較簡單直接的結(jié)構(gòu)型設(shè)計模式。它主要處理了,客戶端與產(chǎn)品之間交接的部分不適配的問題??蛻舳送ㄟ^適配器間接使用目標(biāo)產(chǎn)品,適配器對與客戶端和產(chǎn)品出入交接處進行處理,比如入?yún)f(xié)議或者格式不一樣。但最終保證客戶端正常使用產(chǎn)品功能得到產(chǎn)品處理結(jié)果,而不做任何對產(chǎn)品業(yè)務(wù)邏輯的再處理或者增強。對于不適配的兩個體系(客戶端、產(chǎn)品)加一個中間層。
單一職責(zé)原則,將接口或數(shù)據(jù)轉(zhuǎn)換代碼從程序主要業(yè)務(wù)邏輯中分離,而不是為了調(diào)不適配的接口要在客戶端業(yè)務(wù)代碼里面編寫調(diào)整適配代碼后再調(diào)用,把這些抽到適配器當(dāng)中。
開閉原則。只要客戶端代碼與適配器進行交互, 你就能在不修改現(xiàn)有客戶端代碼的情況下在程序中添加或者修改新類型的適配器,新的適配規(guī)則。




END
往期推薦
3分鐘學(xué)設(shè)計模式(創(chuàng)建型):5、原型模式
3分鐘學(xué)設(shè)計模式(創(chuàng)建型):4、建造者模式
3分鐘學(xué)設(shè)計模式(創(chuàng)建型)3、抽象工廠模式
3分鐘學(xué)設(shè)計模式(創(chuàng)建型):2、工廠方法模式
