[設計模式] 適配器模式 + 外觀模式

[設計模式] 適配器模式 + 外觀模式

手機用戶請橫屏獲取最佳閱讀體驗,REFERENCES中是本文參考的鏈接,如需要鏈接和更多資源,可以關注其他博客發佈地址。

平臺 地址
CSDN https://blog.csdn.net/sinat_28690417
簡書 https://www.jianshu.com/u/3032cc862300
個人博客 https://yiyuery.github.io/NoteBooks/

適配器模式

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

適配器有兩種,一種是類適配器,另一種是對象適配器。

對象適配器

利用組合的方式將請求傳送給被適配器

UML

在這裏插入圖片描述

顧名思義,ProductV2API是新的API接口,ProductV1API爲歷史API接口,實現類HisAPIAdaptee爲歷史API的實現類,即被適配者。

代碼

歷史接口 & 實現


public interface ProductV1API {

    /**
     * V1 版本產品接口
     */
    void specificRequest();
}

public class HisAPIAdaptee implements ProductV1API {
    /**
     * V1 版本產品接口
     */
    @Override
    public void specificRequest() {
        System.out.println("Adaptee specificRequest");
    }
}

適配器實現新的接口,並傳入歷史接口的實現類(被適配者)

public class APIAdapter implements ProductV2API {

    private HisAPIAdaptee adaptee;

    public APIAdapter(HisAPIAdaptee adaptee) {
        this.adaptee = adaptee;
    }

    @Override
    public void request() {
        adaptee.specificRequest();
    }


}

客戶端調用

//客戶端程序
public class Client {

    public static void main(String[] args) {
        //老接口使用
        HisAPIAdaptee hisAPIAdaptee = new HisAPIAdaptee();
        hisAPIAdaptee.specificRequest();

        //適配後新接口對外暴露使用
        new APIAdapter(hisAPIAdaptee).request();
    }
}

類適配器

利用多重繼承實現,請求傳送給被被適配者

APIAdapter 繼承 ProductV1APIProductV2API的實現類,在適配器內部實現請求方法的轉發。

但是Java中不允許這樣做!

適配器和裝飾者模式

各自特點

  • 適配器用來封裝接口,解決接口版本迭代對客戶端的兼容問題,適配器將一個接口轉成另一個接口
  • 裝飾者模式用來包裹對象,補充對象屬性,被裝飾者可以被裝飾器替代使用,支持多層嵌套。
  • 裝飾者模式不改變接口,但是加入責任

相似點

  • 都是通過包裹將操作委派給被裝飾者和被適配者
  • 都會實現公共接口或是抽象基類

外觀模式

外觀模式:提供一個統一的接口,用來訪問子系統的一羣接口,外觀定義了一個高層接口,讓子系統更容易使用

UML

在這裏插入圖片描述

//定義外觀行爲
public interface Facade {

    /**
     * 開啓
     */
    void on();

    /**
     * 關閉
     */
    void off();
}

//實現外觀行爲並針對每個子系統進行統一的外觀包裝


//燈光控制
public class LightAPI implements Facade {
    /**
     * 開啓
     */
    @Override
    public void on() {
        System.out.println("Light turned on!");
    }

    /**
     * 關閉
     */
    @Override
    public void off() {
        System.out.println("Light turned off!");
    }
}

//TV控制
public class TVAPI implements Facade {
    /**
     * 開啓
     */
    @Override
    public void on() {
        System.out.println("TV turned on!");
    }

    /**
     * 關閉
     */
    @Override
    public void off() {
        System.out.println("TV turned off!");
    }
}

//全局外觀控制
public class FacadeImpl implements Facade {

    LightAPI light = new LightAPI();
    TVAPI tv = new TVAPI();

    /**
     * 開啓
     */
    @Override
    public void on() {
        light.on();
        tv.on();
    }

    /**
     * 關閉
     */
    @Override
    public void off() {
        light.off();
        tv.off();
    }
}

外觀行爲的接口定義可以換成其他具體類,非必要實現,外觀模式的重點的是封裝一批接口,對外提供一個高層接口。

設計原則:

  • 最少知識原則(只和親密的朋友交談)

總結

適配器模式

  • 當一個現有的類的使用,但是對應接口無法符合你的需要時,可以使用。
  • 可以改變接口以符合客戶的期望
  • 適配器實現的複雜度和目標接口的大小和複雜度成正比
  • 類適配器需要使用多重繼承,Java中無法使用
  • 適配器講一個對象包裝起來以改變其接口

外觀模式:

  • 將客戶從一個複雜子系統中解耦,提供一個高層次的應用接口。
  • 不同子系統接口的組合可以實現多個外觀,視需求和接口複雜度而定。
  • 將一羣對象包裝起來以簡化其接口

裝飾者模式:

  • 將一個對象包裝起來,以增加新的行爲和責任

更多

掃碼關注架構探險之道,回覆文章標題,獲取本文相關源碼和資源鏈接

在這裏插入圖片描述

知識星球(掃碼加入獲取歷史源碼和文章資源鏈接)

在這裏插入圖片描述

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