設計模式 —— 適配器模式(Adapter Pattern)

適配器模式(Adapter Pattern)

概念:

定義:適配器模式 將一個類的接口,轉換成客戶期望的另一個接口。適配器讓原本接口不兼容的類可以合作無間。


組成:

適配器模式

Client:客戶端,直接操控適配器。
Target(目標接口):適配器實現的目標接口。
Adapter:適配器,當被調用時委託給被適配者。
Adaptee:被適配者,適配器所有的請求都委託給自己。

注:上圖是對象適配器模式,在支持多重繼承的語言中(Java 不支持)我們可以使用 適配器模式,將 Adapter 繼承 Target 和 Adaptee 即可,繼承後 Adapter 可響應兩個類的請求。


例子:

鴨子和火雞都會叫和飛,現有我們需要將火雞和鴨子僞裝起來,用火雞來冒充鴨子,鴨子和火雞的叫聲不同,並且鴨子飛行距離是火雞的 5 倍。

適配器模式


Duck 接口類,包含 quack 和 fly 方法

public interface Duck {
    public void quack();
    public void fly();
}

綠頭鴨類

public class MallardDuck implements Duck {
    public void quack() {
        System.out.println("quack");
    }

    public void fly() {
        System.out.println("I'm flying");
    }
}

火雞類

public interface Turkey {
    public void gobble();
    public void fly();
}

火雞具體類

public class WildTurkey implements Turkey {
    public void gobble() {
        System.out.println("Gobble gobble");
    }

    public void fly() {
        System.out.println("I'm fly a short distance");
    }
}

適配器類

public class TurkeyAdatptor implements Duck {
    Turkey turkey;

    public TurkeyAdatptor(Turkey turkey) {
        this.turkey = turkey;
    }

    public void quack() {
        turkey.gobble();
    }

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

測試代碼:

public class DuckTestDrive {
    public static void main(String[] args) {
        MallardDuck duck = new MallardDuck();

        WildTurkey turkey = new WildTurkey();

        Duck turkeyAdapter = new TurkeyAdatptor(turkey);

        System.out.println("The Turkey says...");
        turkey.gobble();
        turkey.fly();

        System.out.println("\nThe Duck says...");
        duck.quack();
        duck.fly();

        System.out.println("\nThe Adatper Duck says");
        turkeyAdapter.quack();
        turkeyAdapter.fly();
    }
}

運行結果:

適配器模式


適用場景:

  • 你想使用一個已經存在的類,而它的 接口 不符合你的需求。
  • 你想創建一個可以複用的類,該類可以與其他不相關的類或不可預見的類(即那些接口可能不一定兼容的類)協同工作。
  • (僅適用於對象Adapter)你想使用一些已經存在的子類,但是不可能對每一個都進行子類化以匹配它們的接口。對象適配器可以適配它的父類接口。即僅僅引入一個對象,並不需要額外的指針以間接取得adaptee。

優缺點:

優點:

  • 適配器模式也是一種包裝模式,它與裝飾模式同樣具有包裝的功能,此外,對象適配器模式還具有委託的意思。總的來說,適配器模式屬於補償模式,專用來在系統後期擴展、修改時使用。

缺點:

  • 過多的使用適配器,會讓系統非常零亂,不易整體進行把握。比如,明明看到調用的是 A 接口,其實內部被適配成了 B 接口的實現,一個系統如果太多出現這種情況,無異於一場災難。因此如果不是很有必要,可以不使用適配器,而是直接對系統進行重構。

參考:

《Head first 設計模式》

適配器模式原理及實例介紹

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