結構型模式:介面卡模式

LieBrother發表於2019-04-17

文章首發: 結構型模式:介面卡模式

夜

七大結構型模式之一:介面卡模式。

簡介

姓名 :介面卡模式

英文名 :Adapter Pattern

價值觀 :老媒人,牽線搭橋

個人介紹 : Convert the interface of a class into another interface clients expect.Adapter lets classes work together that couldn't otherwise because of incompatible interfaces. 將一個類的介面變換成客戶端所期待的另一種介面,從而使原本因介面不匹配而無法在一起工作的兩個類能夠在一起工作。 (來自《設計模式之禪》)

你要的故事

大家有買過港式的 Apple 產品麼?在深圳的同學估計買過,畢竟港式的 Apple 產品基本比國內便宜 500 以上。我手機和平板都是在香港買的,買來後這充電器是沒法直接充電的,因為港版的電子產品都是英式的插頭,而我們們國內是中式的,所以用上港版電子產品的同學免不了要用上這麼一個轉換器:將英式的插孔轉為中式的插孔,方可插入我們家裡的插座充電。這個轉換器就是今天想講的介面卡。

沒見過的同學可以看看圖片熟悉一下,下圖右邊為港版蘋果手機充電器,插頭比較大,左邊為某品牌轉換器,插頭為中國家用標準形狀。

英中轉換器

下圖為使用時的圖片

使用中

在這描述一下這個場景。用港式插頭要在國內充電,因為插頭和插座大小對不上,所以需要加一個介面卡,這個介面卡充當插頭和插座,它的插頭可以插入國內標準的插座,它的插座可以插入港式標準的插頭,這樣子就可以用港式充電器在國內為手機充電。

下面用介面卡模式程式碼實現這個場景。

首先需要找到被適配的物件是什麼?在這裡我們的被適配物件是英式充電器。

/**
 * 英式充電器
 */
class BritishCharger {

    public void chargeByBritishStandard(){
        System.out.println("用英式充電器充電");
    }

}
複製程式碼

在這個場景的目的是什麼?在中國為港式手機充電,因此目的是讓英式充電器能夠在中國標準的插座充電。

/**
 * 使用中式插座充電
 */
interface Target {

    void chargeByChineseStandard();

}
複製程式碼

接下來是這個設計模式的主角:介面卡。它需要連線中式插座以及英式充電器,在中間做適配功能。

/**
 * 充電器介面卡
 */
class ChargerAdapter implements Target {

    private BritishCharger britishCharger;

    public ChargerAdapter(BritishCharger britishCharger) {
        this.britishCharger = britishCharger;
    }

    @Override
    public void chargeByChineseStandard() {
        System.out.println("使用中英式插頭轉換器");
        britishCharger.chargeByBritishStandard();
    }
}
複製程式碼

上面是介面卡模式的一個簡單的例子,要學習介面卡模式也可以看看 Java 的 IO 實現原始碼,裡面是應用介面卡模式的官方很好的程式碼。

總結

介面卡很好的將 2 個無法關聯的類結合起來,在中間起橋樑作用。另外新增介面卡程式碼不會影響原來被適配者的正常使用,他們可以一起被使用。在工作中和外部系統對接的時候,大可能外部系統的資料格式和自己系統的資料格式並不相同,這時候就可以利用介面卡模式來實現。

推薦閱讀

行為型模式:訪問者模式

行為型模式:直譯器模式

行為型模式:備忘錄模式

公眾號後臺回覆『大禮包』獲取 Java、Python、IOS 等教程

加個人微信備註『教程』獲取架構師、機器學習等教程

LieBrother

相關文章