設計之禪——適配器模式

概述

對於適配器相信大家不會陌生,生活中有各種各樣的例子,像耳機轉接線,充電器適配器,水管適配接口等等。通過類比我們很容易理解適配器的作用:

將已有的本無法使用的類通過適配器轉換,從而達到資源複用,節省開銷的目的。

那要如何通過代碼實現這一點呢?既然要將被適配者轉換爲目標接口類,那麼適配器肯定是要實現自該接口的,以保證類型、行爲的一致,但要如何轉換呢?很簡單,只需要通過繼承或組合被適配者就能輕易的實現。注意基於多使用組合,少使用繼承的原則,我們一般會選擇組合的方式來實現,這種方式叫對象適配器,而通過繼承實現的叫類適配器,後者一般用於一個適配器需要轉換多個被適配者的情況;但Java中沒有多繼承,因此此處僅討論對象適配器。類圖如下:
在這裏插入圖片描述

Coding

小明有一臺用腎換來的IPhone,某天IPhone的充電器壞了,但IPhone的充電器太貴,小明沒錢買新的了,他想到之前的Android充電器還是好的,但是不兼容IPhone手機啊,不過小明知道網上有Android和IPhone的接口轉換器賣,而且很便宜,立馬就買了一個回來,完美解決,不用再賣腎了。我們就用代碼來實現這個過程,首先是IPhone和Android:
···java
public class IPhone {

// 注意IPhone充電器現在是不能正常工作的
public void iPhoneCharging() {
    System.out.println("充電器壞了。。。");
}

}

public class Andriod {

public void andriodCharging() {
    System.out.println("充電中....");
}

}
···
可以看到這兩個東西完全沒有關聯,但小明需要Android充電器和IPhone充電器一樣爲IPhone充電:

public class AndriodAdatper extends IPhone {

    private Andriod andriod;

    public AndriodAdatper(Andriod andriod) {
        this.andriod = andriod;
    }

    @Override
    public void iPhoneCharging() {
        andriod.andriodCharging();
    }

}

有了這個適配器小明就可以正常充電了:

public class XiaoMing {

    public static void main(String[] args) {
        Andriod andriod = new Andriod();
        IPhone iPhone = new AndriodAdatper(andriod);
        iPhone.iPhoneCharging();
    }

}

實現適配器非常容易,通過上述代碼,我們也可以看到被適配者對於客戶端而言是完全透明的,具體需要適配什麼也是由客戶端來決定的,通過適配器就將現有的接口類和被適配者完全解耦了,但是我們也可以發現每當需要轉換一個類時都需要一個適配器,這樣就會導致系統結構變得非常複雜,因此使用時也需要格外注意。

小結

適配器模式可以將一個不兼容的類轉化爲可複用的類,這樣可以使得我們不用添加額外冗餘臃腫的代碼,但同時也會產生許多的適配器類,也會增加系統的複雜性。同時,既然是轉換不兼容的類,那麼該模式應儘可能的用於項目後期的補償,而不是初期的詳細設計中,否則就應該好好考慮下初期設計是否合理。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章