設(shè)計(jì)模式系列教程—Adapter Pattern(適配器模式)

07 Adapter Pattern(適配器模式)

前言:通過將類的接口轉(zhuǎn)換成想要的接口,以便實(shí)現(xiàn)不用的接口。我們的程序可以用新的接口來封裝舊的接口,而客戶是無感知地調(diào)用新接口或者舊接口。
例子說明:
EXP1:港版的蘋果手機(jī),用過港版的一定知道,港版手機(jī)的充電器是三角粗頭的,而大陸的插座則是細(xì)頭的,這樣需要使用港版的充電器的時(shí)候就需要有三轉(zhuǎn)二的轉(zhuǎn)接口,這里的轉(zhuǎn)接口實(shí)際上就充當(dāng)適配器的作用。

港版

轉(zhuǎn)接口

大陸插座

REQ1:現(xiàn)在有這么種需求,我們?cè)诘谝徽鹿?jié)曾經(jīng)寫過鴨子類吧,現(xiàn)在我們需要將火雞包裝成鴨子。
分析:先來看看類圖,說明火雞適配器也繼承了接口Duck,而火雞適配器中裝配了火雞,來實(shí)現(xiàn)具體的叫和飛的功能。


image.png

下面通過代碼來實(shí)現(xiàn)這個(gè)部分,你會(huì)發(fā)現(xiàn)你將火雞變成了鴨子來用了。
火雞適配器:

public class TurkeyAdatpter implements Duck {

    private Turkey turkey;
    
    public TurkeyAdatpter(Turkey turkey) {
        this.turkey = turkey;
    }
    
    public void quack() {
        turkey.gobble();
    }

    public void fly() {
        for(int i=0; i<5; i++) {
            turkey.fly();
        }
    }
    
}

分析:適配器模式非常地簡單,實(shí)際上就是適配器來調(diào)用被適配者的功能。
1 客戶通過目標(biāo)接口調(diào)用適配器地方法對(duì)適配器發(fā)出請(qǐng)求
2 適配器使用被適配者接口把請(qǐng)求轉(zhuǎn)換成被適配者的一個(gè)或多個(gè)調(diào)用接口
3 客戶接收到調(diào)用的結(jié)果,但并未察覺這一切是適配器在起轉(zhuǎn)換作用。

適配器模式:將一個(gè)類的接口轉(zhuǎn)換成客戶期望的另一個(gè)接口,適配器讓原本接口不兼容的類可以合作無間。
這個(gè)模式可以通過創(chuàng)建適配器進(jìn)行接口轉(zhuǎn)換,讓不兼容的接口變成兼容。這可以讓客戶從實(shí)現(xiàn)的接口解耦。
下面是模式的一般類圖:

image.png

適配器模式很好地運(yùn)用了OO的設(shè)計(jì)原則,使用對(duì)象組合,以修改的接口包裝被適配者。
命令對(duì)象:

public class AirConditionOnCommand implements Command {

    private AirCondition airCondition;
    
    public AirConditionOnCommand(AirCondition airCondition) {
        this.airCondition = airCondition;
    }
    
    public void excute() {
        airCondition.setCool();
        airCondition.setTemperature(25);
        airCondition.on();
    }

}

接下來,我們看看Java中的適配器。早期Collection類型(Vector、Stack、Hashtable)都實(shí)現(xiàn)了elements方法,該方法返回一個(gè)Enumeration(枚舉)。這個(gè)Enumeration接口可以遍歷集合中的每個(gè)元素。后來sun推出更新后的集合類后,開始使用迭代器(Iterator)接口,這個(gè)接口和枚舉接口很類似,不同的是它還多個(gè)刪除元素的能力。
在EnumeratorIterator中要處理remove方法,適配器無法實(shí)現(xiàn)一個(gè)實(shí)際功能remove方法,只能拋出一個(gè)RuntimeException,Java的設(shè)計(jì)者也定義了UnsupportedException。


image.png

枚舉適配器:

public class EnumeratorIterator<E> implements Iterator<E> {

    private Enumeration<E> enumer;
    
    public boolean hasNext() {
        return enumer.hasNext();
    }

    public E next() {
        return enumer.next();
    }

    public E remove() {
        throw new UnsupportedOperationException();
    }

}

最后的最后,我們又來總結(jié)我們現(xiàn)在現(xiàn)有的設(shè)計(jì)模式武器。

面向?qū)ο蠡A(chǔ)

抽象、封裝、多態(tài)、繼承

六大設(shè)計(jì)原則

設(shè)計(jì)原則一:封裝變化
設(shè)計(jì)原則二:針對(duì)接口編程,不針對(duì)實(shí)現(xiàn)編程
設(shè)計(jì)原則三:多用組合,少用繼承
設(shè)計(jì)原則四:為交互對(duì)象之間的松耦合設(shè)計(jì)而努力
設(shè)計(jì)原則五:對(duì)擴(kuò)展開放,對(duì)修改關(guān)閉
設(shè)計(jì)原則六:依賴抽象,不要依賴于具體的類

模式

適配器模式:將一個(gè)類的接口轉(zhuǎn)換成客戶期望的另一個(gè)接口,適配器讓原本接口不兼容的類可以合作無間

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容