Android重拾設(shè)計模式系列——適配器模式

個人博客CoorChice,https://chenbingx.github.io/ ,最新文章將會首發(fā)CoorChice的博客,歡迎探索哦 !
同時,搜索微信公眾號CoorChice,或掃描文章末尾二維碼,可以關(guān)注我的微信公眾號。同期文章也將會優(yōu)先推送到微信公眾號中,以提醒您有新鮮文章出爐。

封面-設(shè)計模式.png

定義及實質(zhì)

  • 定義
    將一個類的接口轉(zhuǎn)換為客戶希望的另一個接口,適配器模式使原本由于接口不兼容不能一起工作的類,可以在一起工作。

  • 實質(zhì)
    類型轉(zhuǎn)換,功能復(fù)用。

比較抽象,往下繼續(xù)看看。

模式圖解

對象適配器

解釋:

現(xiàn)在有一個單手劍(現(xiàn)有接口),但英雄只能裝備法杖(目標(biāo)接口)。所以需要定義一個單手劍轉(zhuǎn)換器(適配器),把法杖插進(jìn)去,它屬于單手劍系列,但內(nèi)部其實是一根法杖(持有現(xiàn)有接口)!當(dāng)英雄使用單手劍轉(zhuǎn)化器時,實際使用的是法杖。

對象適配器模式UML圖

對象適配器模式UML圖

從上圖可以看出:

  1. Target接口Client客戶端所要求的接口;
  2. Adapter是適配器,實現(xiàn)了Target接口,持有Adaptee(原始類型,通常它與Client不兼容,但Client又想要使用它的功能),并且將它適配成了Client要求的Target類型。

來看看原始類型Adaptee

public class Adaptee{
    
    public void specificRequest(){
        //do something...
    }
}

Target接口及Adapter接口

public interface Target{
    void request();
}

public class Adapter implements Target{
    private Adaptee daptee;
    
    public Adapter{
        daptee = new Adaptee();
    }
    
    public void request(){
        adaptee.sepcificRequest();
    }
}

Client如何使用

public class Client{
    private Target target;
    
    public static void main(String[] args){
        target = new Adapter(); //創(chuàng)建適配器,但功能仍然是Adaptee的
        target.request(); //實際調(diào)用的是Adapter的specificRequest()方法
    }
}

對象適配器模式順序圖

對象適配器模式順序圖

結(jié)合上面代碼看。

類適配器模式

還是上面那個例子,但這次不需要單手劍轉(zhuǎn)換器了,而是直接創(chuàng)建一種即是單手劍,又是法杖的武器(采用多重繼承,但是Java世界不支持!)。在Java宇宙中,只能通過繼承單手劍,Copy法杖功能來實現(xiàn)。

類適配器模式UML圖

類適配器模式UML圖
  1. 從圖中可以看到,類適配器模式使用了多重繼承的特性,但是Java只支持單繼承,所以這種模式在Java中不是太適用;
  2. Adapter適配器同時繼承了Client所期望的類型Target類,和想要使用的功能類Adaptee類。
  3. 客戶端只需要調(diào)用Adapter繼承到的specificRequest()方法即可。

這個模式在Java中不常用,而且順序圖比較簡單,就不展示了。

拓展——接口適配器

嚴(yán)格來說接口適配器并不是標(biāo)準(zhǔn)的適配器模式,它只是借用了適配器的概念而已。接下來看看它是怎么一回事。

場景:
我們可能遇到過這樣一種場景,就是一個interface的方法很多,而我們只想使用其中少數(shù)幾個,并不想直接實現(xiàn)它,然后把所有方法都重寫一遍。

解決方法:
創(chuàng)建一個abstract抽象類,實現(xiàn)目標(biāo)接口interface,然后我們就可以繼承這個抽象類,選擇其中想要的方法去實現(xiàn)邏輯,而不用把所有方法都列出來。

接口適配器模式UML圖

接口適配器模式UML圖

如圖,AbstractAdapter實現(xiàn)了Api,然后Adapter繼承AbstractAdapter就可以選擇想要的方法重寫就好,而不用把所有方法都列出來。
它最大的作用其實在寫內(nèi)部類的時候,有的接口要求重寫的方法很多,這樣會多出很多行無用的代碼,這個時候就可以定義一個接口適配器,選擇性的列出并重寫方法就好。

模式優(yōu)缺點

優(yōu)勢

  • 轉(zhuǎn)換接口,提高復(fù)用性;
  • 具有更好的擴展性。我們可以在適配器中擴展新功能,同時還能兼顧老功能。

缺點

  • 使用不合理容易造成迷惑。當(dāng)我們調(diào)用A對象的功能時,其內(nèi)部其實是調(diào)用了B的功能,讓人不易理解。
CoorChice的公眾號
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

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