深刻理解適配器模式

適配器模式

說到適配器,小秋第一想到的是咱們電腦的電源適配器,它可以將220v,110v等不一樣電壓轉換爲咱們電腦須要的電壓值供電腦使用,那麼你知道適配器模式是怎樣實現的嗎,下面就和小秋一塊兒探索一下適配器的工做模式吧html

定義

將一個類的接口轉換成客戶但願的另外一個接口java

動機

一般狀況下,客戶端能夠經過目標類的接口訪問它所提供的服務。有時,現有的類能夠知足客戶類的功能須要,可是它所提供的接口不必定是客戶類所指望的,這多是由於現有類中方法名與目標類中定義的方法名不一致等緣由所致使的。數據庫

組件

  • 目標(Target)角色:客戶端所期待獲得的接口,
  • 適配器(Adaper)角色:適配器類是本模式的核心。適配器把源接口轉換成目標接口。顯然,這一角色不能夠是接口,而必須是具體類。
  • 源(Adapee)角色被適配者:如今須要被適配的接口

分類

類適配器模式

定義

經過多重繼承將apdatee2接口與target接口進行匹配,將適配的類apdatee2的API轉換成爲目標類的API設計模式

結構

圖片描述

優勢

  • 適配器能夠重定義Adaptee的部分行爲,至關於子類覆蓋父類的部分實現方法。
  • 僅僅引入了一個對象,並不須要額外的引用來間接獲得Adaptee

缺點

因爲適配器直接繼承了Adaptee,使得適配器不能和Adaptee的子類一塊兒工做,由於繼承是靜態的關係,當適配器繼承了Adaptee後,就不可能再去處理 Adaptee的子類了ide

對象的適配器模式

定義

被適配的類的API轉換成爲目標類的API,與類的適配器模式不一樣的是,對象的適配器模式不是使用繼承關係鏈接到Adaptee類而是使用委派關係鏈接到Adaptee類工具

結構

圖片描述

優勢

  • 一個適配器能夠把多種不一樣的源適配到同一個目標。換言之,同一個適配器能夠把源類和它的子類都適配到目標接口。由於對象適配器採用的是對象組合的關係,只要對象類型正確,是否是子類都無所謂。
  • 符合設計原則:多用合成/聚合、少用繼承,從而減小類之間的耦合

缺點

  • 要重定義Adaptee的行爲比較困難,這種狀況下,須要定義Adaptee的子類來實現重定義,而後讓適配器組合子類。雖然重定義Adaptee的行爲比較困難,可是想要增長一些新的行爲則方便的很,並且新增長的行爲可同時適用於全部的源
  • 須要額外的引用來間接獲得Adaptee。

實現

目標接口(客戶端調用的接口)this

package adapter;

//目標接口(客戶端須要使用的接口)
public interface Target {
    //客戶端須要請求處理的方法
    public void request();
}

源接口(須要被適配的接口)spa

package adapter;

//源接口(已經存在的接口)
//須要被轉換的對象
//這個接口須要從新配置以適應目標接口
public class Adaptee {

    public void specifiRequest() {
        System.out.println("源接口對象調用源接口中的方法");
    }
}

適配器設計

package adapter;

public class Adapter implements Target {

    //持有源接口對象
    private Adaptee adaptee;

    /**
     * 構造方法,傳入須要被適配的對象
     * @param adaptee
     */
    public Adapter(Adaptee adaptee) {
        this.adaptee = adaptee;
    }

    /**
     * 重寫目標接口的方法,以適應客戶端的需求
     */
    @Override
    public void request() {
        //調用源接口的方法
        System.out.println("適配器包裝源接口對象,調用源接口的方法");
        adaptee.specifiRequest();
    }
}

客戶端代理

package adapter;

public class Client {
    public static void main(String[] args){

        //建立源對象(被適配的對象)
        Adaptee adaptee = new Adaptee();
        //利用源對象對象一個適配器對象,提供客戶端調用的方法
        Adapter adapter = new Adapter(adaptee);
        System.out.println("客戶端調用適配器中的方法");
        adapter.request();

    }
}
//客戶端調用適配器中的方法
//適配器包裝源接口對象,調用源接口的方法
//源接口對象調用源接口中的方法

優勢

目標類和適配者類解耦,增長了類的透明性和複用性,同時系統的靈活性和擴展性都很是好,更換適配器或者增長新的適配器都很是方便,符合「開閉原則」

缺點

過多的使用適配器,會讓系統很是零亂,不易總體進行把握。好比,明明看到調用的是A接口,其實內部被適配成了B接口的實現

應用案例

Java語言的數據庫鏈接工具JDBC,JDBC給出一個客戶端通用的抽象接口,每個具體數據庫引擎(如SQL Server、Oracle、MySQL等)的JDBC驅動軟件都是一個介於JDBC接口和數據庫引擎接口之間的適配器軟件

應用場景

  • 後期維護,因爲不一樣的廠家不一樣的產品以及不一樣的開發人員
  • 調用第三方組件
  • 雙方都不太容易修改的時候

用途

想要複用一些現有的類,可是接口與複用環境要求不一致

適配器模式與裝飾模式的對比

UML圖

  • 適配器模式

圖片描述

  • 裝飾器模式

圖片描述

內容

  • 適配器模式

    • 持有的是待適配的對象,實現的是目標接口,兩個不同
    • 擴展了待適配類新的功能
    • 適配器模式拓展了新的功能
  • 裝飾器模式

    • 持有對象和繼承的對象通常是同一個類或接口
    • 裝飾模式中裝飾過的類力求與原來對外接口一致,這使得在調用方看來,裝飾事後的類與以前沒有什麼區別,只是某一方面功能加強了
    • 裝飾模式加強了原有功能

總結

'裝飾模式與適配器模式是不衝突的,能夠既加強原有功能,又添加全新的功能。

最後附上一張適配器的概覽圖

圖片描述

參考

適配器模式

《JAVA與模式》之適配器模式

【Java基礎】淺談常見設計模式

適配器模式原理及實例介紹

適配器模式、裝飾模式、代理模式的異同

相關文章
相關標籤/搜索