設計模式之適配器模式/外觀模式

適配器模式

 

<適配器模式主要作用是進行接口的轉換。當將新的類加入到並沒有按原來接口規範的類中時,我們可以定義一個適配器類(他擁有原來類的引用),來包裝加入的類,並且實現原來的接口,實際調用的還是被適配的方法。使得無需改動客服端代碼的情況下加入新的不符合原來接口規範的類到舊的系統中去>

 

 

[ 圖片來源百度百科 ]

 

 

在現實生活中我們有很多適配器模式的場景,比如各種的USB轉接口,HDMI轉接口等。

 

                   

[ 圖片來源百度百科 ]

 

 

同樣的在軟件中我們也經常會用到這個模式,下面我們通過具體的例子來對該模式進行講解。

 

我們這裏有一個USB接口,通過該接口機器可以獲取連接他的設備傳輸的信息。

interface USB{
    
    //該接口可以讀取連接他設備的信息或者向其中寫如數據
    public void read();
    public void write();

}

這隻其中他的一個設備

class USB1 implements USB{

    public void read(){
        //讀取設備信息
    }

    public void wirte(){
        //向設備寫入信息
    }
}

這裏是客服端代碼

class Client{
    USB usb;    
    
    public void setUSB(USB usb){
        this.usb = usb; 
    }

    public static void main(String[] args){
        Client c = new Client();
        c.setUSB(new USB1());

        usb.read();  //通過接口讀取信息
        usb.write(); //通過接口寫入信息
    }

}

可以看到只要實現了USB接口的類,客服端都可以直接操作其進行數據的讀取與寫入。

但是此時我們有一個類並沒有遵守該接口規範來進行對方法的編寫。如下類

class IODev{
    
    public void readByte(){
        //具體操作
    }

    public void writeByte(){
        //具體操作
    }

}

該類沒有遵守接口的規範客服端無法直接使用該類。但此時我們的IODev代碼以及寫好了不想改動(可能還有很多這樣的類),客服端代碼也不想變動(變動可能涉及很類的代碼修改)。於是我們新設計一個類以適應客服端。這就是我們所說的適配器類

class IODevToUSB implements USB{
    public IODev ioDev;
    
    public void read(){
        ioDev.readByte();
    }
    
    pulbic void write(){
        ioDev.write();
    }
}

這個類的作用主要在於接口的轉換,以適應代碼之間的不兼容。可以看到該類其實就是將不適配的類進行了封裝,使得客服端無需關注他具體是調用的誰的代碼,而且可以在原來代碼不加以改動的情況下使得系統兼容新的類。

其實該適配器類也可以實現多個接口規範(Java中是可以實現多個接口的)來適應多個不兼容的類,並將這些類進行封裝來適應系統。當然這個適配是類也可以接受被適配的子類。

以上是通過實現接口來實現適配器模式的,其實還可以通過繼承的方式來實現,但是需要繼承兩個類,Java並不支持多繼承所以這裏舉例說這種情況了。

 

 

 

 

 

外觀模式

 

<外觀模式是爲了簡化接口而設計的,該模式和適配器模式有很多相同點,都是將類進行封裝,只是使用的意圖不同,一個是爲了接口轉換,一個是爲了簡化接口>

[圖片來源百度百科]

 

 

 

 

該模式是將底層具體的而繁多的類和方法封裝在一個裝飾者類中,而客服端通過創建裝飾者類,運行其方法執行一些複雜的流程。客服端無需知道具體是調用的誰的代碼,也使得客服端從具體類中解耦。

舉一個現實中的例子,比如我們將大象放入冰箱,先要打開冰箱,放入大象,關上冰箱,這個過程可能涉及到三個類,一個是Person  ,Elephant , Refrigerator 。如果我們我只通過客服端去寫這些類可能顯得代碼很繁瑣。於是我們寫一個外觀者類來將這些類進行封裝,裝飾者設置一個將大象放入冰箱的方法(該方法裏面包含了具體的步驟),客服端只需要有這個外觀類即可,然後調用該方法就能完成一件本來看起來複雜的事情。

 

由於外觀者模式較爲簡單我就不寫具體的代碼來進行分析了。

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