適配器模式

適配器模式

好久沒有寫博客了,最近都挺忙的,今天晚上睡不着,想想也不知道幹啥,把最近自己在小組分享的適配器設計模式寫出來,也就是按照自己ppt的流程來的。以後有空,陸陸續續把小組分享的設計模式寫成博客。

1 問題的引入

long long ago,還記得在初中的時候,我們用手機拍了好多好看的圖片,圖片存在手機的內存卡(tf卡)裏,某一天需要把好看的圖片上傳到QQ空間,那麼如何把tf卡里的照片傳輸到電腦上呢?
如何用肚讀取tf卡的內容

1.1 我們的方式

在這裏插入圖片描述

2 適配器介紹及定義

在軟件開發中有時也會存在以上電腦和TF卡不兼容的情況,這樣可以引入SD卡(類似讀卡器)那樣一個適配器來協調這些存在不兼容的結構,這種設計方案就是適配器模式。

定義:
將一個類的接口變換成客戶端所期待的另一種接口,適配器模式讓那些接口不兼容的類可以一起工作。

2.1 適配器種類

適配器模式包括對象適配器和類適配器。

2.2 UML圖

適配器模式UML
Target(目標抽象類): 抽象定義客戶所需的接口,可以是一個抽象類,或者接口,也可以是具體類。
Adaptee(適配者類): 它定義了一個已經存在的接口,這個接口需要適配,適配者類一般是一個具體類,包括了客戶所需要的業務方法。
Adapter(適配器類): 它可以調用另一個接口,作爲一個轉換器,對Adapter和Target進行適配。適配器是適配器模式的核心,在類適配器中,它通過實現Target接口並繼承Adaptee類來使二者產生聯繫;在對象適配器中,它通過繼承Target並關聯一個Adaptee對象使二者產生聯繫。

2.3 兩種適配器的區別

區別:
1.在對象適配器模式當中,適配器和適配者是關聯關係。
對象適配器代碼顯示
2.在類適配器模式中,適配器和適配者之間是繼承(或者實現)關係。
類適配器代碼顯示
3.由於Java不支持多重類繼承,因此類適配器的使用受到很多限制,例如如果目標抽象類Target不是接口,而是一個類,就無法使用類適配器。大部分情況下我們使用的是對象適配器,類適配器較少使用。

3代碼講解

實例: 回到剛開頭的那個例子,計算機如何通過SD(讀卡器)讀取TF卡(通過對象適配器的模式)?
在這裏插入圖片描述

3.1 編寫Target

3.1.1 聲明Computer接口及其具體實現類

public interface Computer {
    /**
     * sdCard對象傳參
     * @param sdCard
     * @return
     */
    String readSD(SDCard sdCard);
}
public class ThinkpadComputer implements Computer {
    /**
     * 創建一個計算機實例,實現計算機接口,並實現其讀取SD卡方法
     * @param sdCard
     * @return
     */
    @Override
    public String readSD(SDCard sdCard) {
        if(sdCard == null){
            throw new NullPointerException("sdCard is null");
        }
        //返回sdCard的read方法
        return sdCard.readSD();
    }
}

3.1.2 聲明SDCard接口及其具體實現類

public interface SDCard {
    /**
     * 創建一個SD卡的接口,讀取SD卡
     * @return
     */
    String readSD();
}
public class SDCardImpl implements SDCard {
    /**
     * 創建SD卡接口的實現類,模擬SD卡的功能:
     * @return
     */
    @Override
    public String readSD() {
        String msg = "sdCard read a message: wow this is sdCard!";
        return msg;
    }
}

3.2 編寫Adaptee

3.2.1 創建TF卡接口及其具體實現類

public interface TFCard {
    /**
     * 創建TF卡接口
     * @return
     */
    String readTF();
}
public class TFCardImpl implements TFCard {
    /**
     * 創建TF卡實例
     * @return
     */
    @Override
    public String readTF() {
        String msg ="tfCard read e message : wow this is  tfCard.";
        return msg;
    }
}

3.3 編寫Adapter

3.3.1 創建適配器類

public class SDAdapterTF implements SDCard {
    /**
     * 創建SD卡適配TF卡 ,實現SDCard接口
     * 將要適配的對象作爲適配器的屬性引入
     */
    private TFCard tfCard;

    public SDAdapterTF(TFCard tfCard){
        this.tfCard = tfCard;
    }

    @Override
    public String readSD() {
        System.out.println("adapter read tfCard.");
        return tfCard.readTF();
    }
}

3.4 創建Client

3.4.1 創建測試方法調用

/**
     * 測試計算機通過SD讀卡器讀取TF卡
     */
    @Test
    public void test(){
        //模擬計算機通過SD讀卡器讀取TF卡
        Computer computer = new ThinkpadComputer();
        TFCard tfCard = new TFCardImpl();
        SDCard tfCardAdapterSD = new SDAdapterTF(tfCard);
        System.out.println(computer.readSD(tfCardAdapterSD));
    }

4 總結

適用場景:
將一個類的接口變換成客戶端所期待的另一種接口,適配器模式讓那些接口不兼容的類可以一起工作。

兩類適配器:
對象適配器和類適配器,類適配器較少使用。

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