《一天一模式》— 適配器模式

1、適配器模式的概念

將一個接口轉換成客戶但願的另外一個接口,使接口不兼容的那些類能夠一塊兒工做,其別名爲包裝器(Wrapper)。 java

2、何時使用適配器模式

通常的通俗例子是:咱們生活用電是220V,給手機充電通常是5V,直接用220V充電是不行的,因此須要一個變壓器(適配器),把220V變成5V。編程

用程序設計來解釋,項目初始階段的需求是:app

  • 有一個方法,輸入參數是獅子對象;
  • 打印出獅子的一些特徵;

程序上線後一段時間,需求有變動,須要讓這個方法也接收老虎對象,打印老虎的特徵,在不改變程序的前提下改如何作?測試

答案就是使用適配器模式來解決這個問題。this

 我的理解是,適配器模式的最大使用場景有兩個:spa

  • 在項目需求有變動的狀況下,不修改原來的代碼,加入適配器來解決需求變動
  • 在沒有辦法修改源碼的狀況下,加入適配器來解決問題

3、如何使用適配器模式

3.1 實現方式

用一個實際的項目場景來舉例:設計

  • 有一種設備(TBox),在汽車出廠前安裝到了汽車內部,它能夠根據協議,向服務端上報汽車點火、控制和熄火的事件;
  • 服務端有一個方法叫handler,接收這個協議;

程序上線後,通過一段時間,有新的需求須要實現:code

  • 一種新設備(OBD),有一些汽沒有安裝TBox,這種狀況下,能夠購買OBD設備安裝到汽車上;
  • OBD能夠向服務端上報點火和熄火事件,可是不能上報遠程控制的事件;
  • 在不修改服務端handler方法的狀況下,讓服務端適配OBD協議;

這種狀況下就可使用適配器模式了,下面是類圖和代碼:server

實現代碼:對象

// TBox的協議接口。
public interface TBoxProtocol {

    // 點火
    void engineOn();

    // 熄火
    void engineOff();

    // 遠程控制
    void control();

}

// TBox對象,實現了TBox協議
public class TBox implements TBoxProtocol {

    // 點火
    public void engineOn() {
        System.out.println("TBox協議:點火");
    }

    // 熄火
    public void engineOff() {
        System.out.println("TBox協議:熄火");
    }

    // 遠程控制
    public void control() {
        System.out.println("TBox協議:遠程控制");
    }

}

// 模擬一個服務端,接收TBox協議作某些業務
public class Server {

    // 先點火、在進行遠程控制、在熄火
    public void handler(TBoxProtocol tBoxProtocol) {
        tBoxProtocol.engineOn();
        tBoxProtocol.control();
        tBoxProtocol.engineOff();
    }

}
// OBD協議
public interface OBDProtocol {

    // 點火
    void engineOn();

    // 熄火
    void engineOff();

}

// OBD對象,實現了OBD協議
public class OBD implements OBDProtocol {

    // 點火
    public void engineOn() {
        System.out.println("OBD協議:點火");
    }

    // 熄火
    public void engineOff() {
        System.out.println("OBD協議:熄火");
    }
}
// TBox適配器,將OBD適配成TBox
public class TBoxAdapter implements TBoxProtocol {

    // 注入一個OBD協議
    private OBDProtocol obdProtocol;

    public TBoxAdapter(OBDProtocol obdProtocol) {
        this.obdProtocol = obdProtocol;
    }

    // 在點火,熄火,遠程控制時,調用OBD協議在這幾個場景下的業務方法
    public void engineOn() {
        obdProtocol.engineOn();
    }

    public void engineOff() {
        obdProtocol.engineOff();
    }

    public void control() {
        // 若是OBD不支持某方法,能夠作其餘處理
        System.out.println("OBD不支持遠程控制。");
    }
}
public class Client {

    public static void main(String[] args) {
        // 建立一個服務端
        Server server = new Server();

        // 建立一個TBox協議,而後發送給服務端
        TBoxProtocol tBoxProtocol = new TBox();
        server.handler(tBoxProtocol);

        System.out.println();

        // TBox
        TBoxAdapter tBoxAdapter = new TBoxAdapter(new OBD());
        server.handler(tBoxAdapter);
    }

}

// 輸入
TBox協議:點火
TBox協議:遠程控制
TBox協議:熄火

OBD協議:點火
OBD不支持遠程控制。
OBD協議:熄火

3.2 適配器模式的好處

適配器的好處以下:

  • 開閉原則:應對需求變動,在不修改現有代碼的狀況下,打到預期效果,符合開閉原則;
  • 簡單透明:客戶端能夠調用同一接口來完成業務,可就是說對客戶端無影響,耦合低;
  • 擴展性強:在實現適配器功能的時候,能夠在調用過程當中作其餘業務,增強了擴展性,更加靈活;

3.3 使用適配器模式須要注意的地方

過多的使用適配器,會讓系統的總體設計變得零亂。

因此,須要養成良好的設計習慣,對文檔和圖例及時進行更新,編寫的簡單易懂,要與現有代碼一致。

4、總結

適配器模式的作法,從程序的角度去理解的話,能夠按照以下步驟:

  • 建立一個適配器,實現或者繼承一個目標(若是目標沒有接口,則須要繼承目標對象,強烈建議基於接口編程,這樣能夠省下類寶貴的繼承機會);
  • 在適配器中注入被適配的類,以參數方式傳遞給適配器;
  • 適配器實現或重寫(對應實現接口或繼承類)目標類方法,在方法內調用被適配的類的方法,實現業務;

從業務角度的話,和在第二小節描述使用場景時同樣:

  • 在需求變動時候,符合開閉原則,不修改原來的代碼,加入適配器實現接口適配,減小測試範圍
  • 在沒有辦法修改源碼的狀況下,加入適配器,完成業務

以上就是我對適配器模式的一些理解,有不足之處請你們指出,謝謝。

相關文章
相關標籤/搜索