1. 程式人生 > >結構型模式:適配器模式

結構型模式:適配器模式

java、 sys 英文 功能 nts ron 作用 簡單的 www.

文章首發:
結構型模式:適配器模式

技術分享圖片

七大結構型模式之一:適配器模式。

簡介

姓名 :適配器模式

英文名 :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 等教程
加個人微信備註『教程』獲取架構師、機器學習等教程

技術分享圖片

結構型模式:適配器模式