設計模式(六)—— 適配器模式

1. 介紹

適配器模式是把一個類的接口變換成客戶端的所期待的另一個接口,從而使原本因接口不匹配而無法在一起工作的兩個類能夠在一起工作。

2. 分類

適配器模式有類的適配器模式和對象的適配器模式兩種形式。

2.1 類的適配器模式

類的適配器模式是把適配的類的API轉換成爲目標類的API.

從上圖中可以看出:Target期待調用Request方法,而Adaptee並沒有(這就是所謂的不兼容了)。

爲使Target能夠使用Adaptee類裏的SpecificRequest方法,故提供一箇中間環節Adapter類(繼承Adaptee & 實現Target接口),把Adaptee的API與Target的API銜接起來(適配)。

模式所涉及的角色有:

  • 目標角色(Target):這就是所期待得到的接口
  • 源角色(Adapee):現在需要適配的接口
  • 適配器角色(Adaper):適配器類,把源接口轉換成目標接口

具體實現

(1)Target接口

public interface Target{
    //這是源類Adaptee沒有的接口
    public void Request();
}

(2)源類(Adaptee)

public class Adaptee {
    public void SpecificRequest() {}
}

(3)適配器類(Adapter)

//繼承Adaptee並實現Target
public class Adapter extends Adaptee implements Target {
    //在適配器中將SpecificRequest()方法轉化爲Request()
    @Override
    public void Request() {
        this.SpecificRequest();
    }
}

(4)定義具體使用類,並通過Adapter類調用所需要的方法

public class AdapterPattern {
    public static void main(String[] args) {
        Target mAdapter = new Adapter();
        mAdapter.Request();
    } 
}

 

2.2 對象的適配器模式

與類的適配器模式相同,對象的適配器模式也是把適配的類的API轉換成爲目標類的API;與類的適配器模式不同的是,對象的適配器模式不是使用繼承關係連接到Adaptee類,而是使用委派關係連接到Adaptee類。

從上圖可以看出:Target期待調用Request方法,而Adaptee並沒有,因此提供一個包裝類Adapter,這個包裝類包裝了一個Adaptee的實例,從而能夠把Adaptee的API與Target類的API銜接起來。Adapter與Adaptee是委派關係,這決定了適配器模式是對象適配器模式。

具體實現

(1)Target接口

public interface Target{
    //這是源類Adaptee沒有的接口
    public void Request();
}

(2)源類(Adaptee)

public class Adaptee {
    public void SpecificRequest() {}
}

(3)適配器類(Adapter)

//不在繼承Adaptee類
public class Adapter implements Target {
    //直接關聯被適配類
    private Adaptee adaptee;
    //可以通過構造函數傳入具體需要適配的被適配類對象
    public Adapter(Adaptee adaptee) {
        this.adaptee = adaptee;
    }

    @Override
    public void Request() {
        //這裏使用委託方式完成轉換
        this.adaptee.SpecificRequest();
    }
}

(4)定義具體使用類,並通過Adapter類調用所需要的方法

public class AdapterPattern {
    public static void main(String[] args) {
        //需要先創建一個被適配類的對象作爲參數
        Target mAdapter = new Adapter(new Adaptee());
        mAdapter.Request();
    } 
}

3. 適配器模式的優缺點

優點

  • 更好的複用性, 可以更好地複用現有的類
  • 更好的擴展性, 在實現適配器功能時,可以調用自己開發的功能,從而自然地擴展系統功能。
  • 解耦性,將目標類和適配者類解耦

缺點

過多使用使用適配器,會讓系統非常零亂,不易整體把握。

4. 對比類的適配器模式和對象的適配器模式

類的適配器模式:

  • 使用對象繼承方式,是靜態定義方式,由於直接繼承了Adaptee類,使得不能再和Adaptee的子類一起工作了;
  • 類適配器可以重新定義Adaptee的部分行爲,相當於子類覆蓋父類的部分實現;
  • 僅僅引入了一個對象,並不需要額外的引用來間接得到adapter。

對象適配器模式:

  • 使用對象組合的方式,是動態組合的方式,因此一個適配器可以把多種不同的源適配到同一目標,換言之,同一個適配器可以把源類和它的子類都是配到目標接口,因爲對象適配器採用的是對象組合關係,只要對象類型正確,是不是子類都無所謂。
  • 對象適配器要重新定義Adaptee的行爲比較困難,這種情況下,需要定義Adaptee的子類來實現重新定義,然後讓適配器組合子類。雖然重新定義Adaptee的行爲比較困難,但是想要增加一些新的行爲則很方便,而且新增加的的行爲可同時適用於所有源。
  • 對象適配器需要額外的引用來間接得到Adapter。

建議儘量使用對象適配器的實現方式,對用組合,少用繼承。當然,具體問題具體分析,根據需要來選用實現方式,最合適的纔是最好的。

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