《Head First 設計模式》:適配器模式

正文

一、定義

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

要點:

  • 適配器實現了目標接口,並持有被適配者的實例。
  • 適配器使用被適配者的方法,把請求轉換成被適配者的一個或多個方法。
  • 客戶通過目標接口調用適配器的方法對適配器發出請求。
  • 客戶與被適配者是解耦的,一個不知道另一個。
  • 當需要使用一個現有的類而其接口並不符合你的需要時,就使用適配器。

二、實現步驟

1、創建被適配者接口

/**
 * 被適配者接口
 */
public interface Adaptee {
    
    public void specificRequest();
}

2、創建具體的被適配者,並實現被適配者接口

/**
 * 具體的被適配者
 */
public class ConcreteAdaptee implements Adaptee {
    
    @Override
    public void specificRequest() {
        System.out.println("ConcreteAdaptee is doing something...");
    }
}

3、創建目標接口

/**
 * 目標接口
 */
public interface Target {
    
    public void request();
}

4、創建適配器類,並實現目標接口

適配器持有被適配者,並在收到請求時調用被適配者的方法。

/**
 * 適配器
 */
public class Adapter implements Target {
    
    /**
     * 被適配者
     */
    Adaptee adaptee;
    
    public Adapter(Adaptee adaptee) {
        this.adaptee = adaptee;
    }

    @Override
    public void request() {
        // 調用被適配者方法
        adaptee.specificRequest();
    }
}

5、使用適配器轉換被適配者

public class Test {
    
    public static void main(String[] args) {
        // 被適配者
        Adaptee adaptee = new ConcreteAdaptee();
        // 適配器
        Adapter adapter = new Adapter(adaptee);
        adapter.request();
    }
}

三、舉個栗子

1、背景

你上班的公司做了一套模擬鴨子游戲。現在,假設你缺鴨子對象,想用一些火雞對象來冒充。

顯而易見,因爲火雞的接口不同,所以我們不能公然拿來用。

2、實現

使用適配器把火雞的方法轉換成鴨子的方法,這樣表面上看起來就像是一隻鴨子了。

(1)創建火雞接口

/**
 * 火雞接口(被適配者)
 */
public interface Turkey {
    
    /**
     * 咯咯叫
     */
    public void gobble();
    
    /**
     * 飛行
     */
    public void fly();
}

(2)創建具體的火雞

/**
 * 野火雞
 */
public class WildTurkey implements Turkey {

    @Override
    public void gobble() {
        System.out.println("Gobble gobble");
    }

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

(3)創建鴨子接口

/**
 * 鴨子接口(目標接口)
 */
public interface Duck {
    
    /**
     * 呱呱叫
     */
    public void quark();
    
    /**
     * 飛行
     */
    public void fly();
}

(4)創建火雞適配器,並實現鴨子接口

/**
 * 火雞適配器
 */
public class TurkeyAdapter implements Duck {
    
    /**
     * 火雞
     */
    Turkey turkey;
    
    public TurkeyAdapter(Turkey turkey) {
        this.turkey = turkey;
    }

    @Override
    public void quark() {
        turkey.gobble();
    }

    @Override
    public void fly() {
        // 火雞飛行距離比鴨子短,因此需要調用5次火雞的fly()方法。
        for (int i = 0; i < 5; i++) {
            turkey.fly();
        }
    }
}

(5)使用火雞適配器,將火雞適配成鴨子

public class Test {
    
    public static void main(String[] args) {
        // 火雞(被適配者)
        Turkey turkey = new WildTurkey();
        // 火雞適配器
        TurkeyAdapter turkeyAdapter = new TurkeyAdapter(turkey);
        turkeyAdapter.quark();
        turkeyAdapter.fly();
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章