設(shè)計(jì)模式 ——— 適配器模式

ADAPTER(適配器) ———— 類對(duì)象結(jié)構(gòu)型模式

意圖

將一個(gè)類的接口,轉(zhuǎn)換成客戶期望的另一個(gè)接口。適配器讓原來(lái)接口不兼容的類可以合作無(wú)間。
現(xiàn)在,我們知道,這個(gè)模式可以通過(guò)創(chuàng)建適配器進(jìn)行接口轉(zhuǎn)換,讓不兼容的接口變成兼容。這可以讓客戶從實(shí)現(xiàn)的接口解耦。如果在一段時(shí)間之后,我們想要改變接口,適配器可以將改變的部分封裝起來(lái),客戶就不必為了應(yīng)對(duì)不同的接口而每次跟著修改。

適配器模式的本質(zhì):轉(zhuǎn)換匹配,復(fù)用功能。
適配器通過(guò)轉(zhuǎn)換調(diào)用已有的實(shí)現(xiàn),從而能把已有的實(shí)現(xiàn)匹配成需要的接口,使之能滿足客戶端的需要。也就是說(shuō)轉(zhuǎn)換匹配是手段,而復(fù)用已有的功能才是目的。

適用性

  • 如果你想要使用一個(gè)已經(jīng)存在的類,但是它的接口不符合你的需求,這種情況可以使用適配器模式,來(lái)把已有的實(shí)現(xiàn)轉(zhuǎn)換成你需要的接口
  • 如果你想創(chuàng)建一個(gè)可以復(fù)用的類,這個(gè)類可能和一些不兼容的類一起工作,這種情況可以使用適配器模式,到時(shí)候需要什么就適配什么
  • (僅適用于“對(duì)象”適配器)如果你想使用一些已經(jīng)存在的子類,但是不可能對(duì)每一個(gè)子類都進(jìn)行適配,這種情況可以選用對(duì)象適配器,直接適配這些子類的父類就可以了。

結(jié)構(gòu)

“類”適配器使用多重繼承對(duì)一個(gè)接口與另一個(gè)接口進(jìn)行匹配


“類”適配器結(jié)構(gòu)圖

“對(duì)象”適配器依賴于對(duì)象組合


“對(duì)象”適配器結(jié)構(gòu)圖
  • Target
    定義Client使用的與特定領(lǐng)域相關(guān)的接口。
  • Client
    與符合Target接口的對(duì)象協(xié)同
  • Adaptee
    定義一個(gè)已經(jīng)存在的接口,這個(gè)接口需要適配
  • Adapter
    對(duì)Adaptee的接口與Target接口進(jìn)行適配

協(xié)作

Client在Adapter實(shí)例上調(diào)用一些操作。接著適配器調(diào)用Adaptee的操作實(shí)現(xiàn)這個(gè)請(qǐng)求。

適配器模式的實(shí)現(xiàn)

  • “對(duì)象”適配器
    這個(gè)適配器模式充滿著良好的OO設(shè)計(jì)原則:使用對(duì)象組合,以修改的接口包裝被適配者:這種做法還有額外的優(yōu)點(diǎn),那就是,被適配者的任何子類,都可以搭配著適配器使用。

  • “類”適配器
    “類”適配器需要多重繼承才能夠?qū)崿F(xiàn)它,這在Java中是不可能的。但是當(dāng)你在使用多重繼承語(yǔ)言的時(shí)候,還是可能遇到這樣的需求。

    “對(duì)象”適配器 VS “類”適配器
    “對(duì)象”適配器和“類”適配器使用兩種不同的適配方式(分別是組合與繼承)?!邦悺边m配器繼承了Target和Adaptee;而“對(duì)象”適配器利用組合的方式將請(qǐng)求傳送給被適配者。

    “類”適配器:
    a) 用一個(gè)具體的Adapter類對(duì)Adaptee和Target進(jìn)行匹配。結(jié)果是當(dāng)我們想要匹配一個(gè)類以及所有它的子類時(shí),“類”適配器將不能勝任工作。
    b) 是的Adapter可以重定義Adaptee的部分行為,因?yàn)锳dapter是Adaptee的一個(gè)子類。
    c) 僅僅引入了一個(gè)對(duì)象,并不需要額外的指針以間接得到adaptee。

    “對(duì)象”適配器:
    a) 允許一個(gè)Adapter與多個(gè)Adaptee ———— 即Adaptee本身以及它的所有子類(如果有子類的話)一同工作。
    b) 是的重定義Adaptee的行為比較困難。這就需要生成Adaptee的子類并且使得Adapter引用這個(gè)子類而不是Adaptee本身。

  • 智能適配器
    在實(shí)際開(kāi)發(fā)中,適配器也可以實(shí)現(xiàn)一些Adaptee沒(méi)有實(shí)現(xiàn),但是在Target中定義的功能,這種情況就需要在適配器的實(shí)現(xiàn)里面,加入新功能的實(shí)現(xiàn),這種適配器被稱為智能適配器。

    如果要使用智能適配器,一般新加入的功能的實(shí)現(xiàn),會(huì)用到很多Adaptee的功能,相當(dāng)于利用Adaptee的功能來(lái)實(shí)現(xiàn)更高層的功能。當(dāng)然也可以完全實(shí)現(xiàn)新加的功能,跟已有的功能都不靠邊,變相是擴(kuò)展了功能。

  • 適配多個(gè)Adaptee
    適配器在適配的時(shí)候,可以適配多個(gè)Adaptee,也就是說(shuō)實(shí)現(xiàn)某個(gè)新的Target的功能的時(shí)候,需要調(diào)用到多個(gè)模塊的功能,適配多個(gè)模塊的功能才能滿足新接口的要求。

  • 缺省適配
    缺省適配的意思是:為一個(gè)接口提供缺省實(shí)現(xiàn)。有了它,就不用直接去實(shí)現(xiàn)接口,而是采用繼承這個(gè)缺省適配對(duì)象,從而讓子類可以有選擇的去覆蓋實(shí)現(xiàn)需要的方法,對(duì)于不需要的方法,就使用缺省適配的方法就可以了。

  • 雙向適配器
    適配器也可以實(shí)現(xiàn)雙向的適配,前面我們講的都是把Adaptee適配成為Target,其實(shí)也可以把Target適配成為Adaptee,也就是說(shuō)這個(gè)適配器可以同時(shí)當(dāng)作Target和Adaptee來(lái)使用。在兩個(gè)不同的客戶需要用不同的方式查看同一個(gè)對(duì)象時(shí),雙向適配器尤其有用。

相關(guān)模式

  • 適配器模式 VS 裝飾模式
    適配器模式與裝飾模式很類似,但僅僅是類似,造成這種類似的原因:兩種設(shè)計(jì)模式在實(shí)現(xiàn)上都是使用的對(duì)象組合,都可以在轉(zhuǎn)調(diào)組合對(duì)象的功能前后進(jìn)行一些附加的處理,因此有這么一個(gè)相似性。它們的目的和本質(zhì)都是不一樣的。一般適配器適配是需要改變接口的;而裝飾模式是不改接口的,無(wú)論多少層裝飾都是一個(gè)接口。
    裝飾模式的本質(zhì)是擴(kuò)展包裝的對(duì)象的行為或責(zé)任;而適配器模式本質(zhì)是轉(zhuǎn)換匹配,復(fù)用功能。

參考

《Head First 設(shè)計(jì)模式》
《設(shè)計(jì)模式:可復(fù)用面向?qū)ο筌浖幕A(chǔ)》
《研磨設(shè)計(jì)模式》

最后編輯于
?著作權(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),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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