接口轉換的利器——適配器模式總結

前言

適配器模式的定義很簡單,就是作一箇中間轉換,相似港版的 iPad,iPhone 等電源插頭,須要一個轉換器,才能使用大陸的插座。html

直接上代碼,很簡單,很少總結了。ide

類的適配器

被適配的類,能夠當作是一箇舊系統裏的穩定的類post

public class Adaptee { // 被適配的類
    public void request() {
        System.out.println("被適配的類:request");
    }
}

下面的是新的接口,或者說須要適配的目標接口this

public interface ITarget { // 新的接口
    void doTargetRequest();
}
//////////////////////////////////////////////////////
public class NewTarget implements ITarget {
    @Override
    public void doTargetRequest() {
        System.out.println("NewTarget的目標方法:doRequest");
    }
}

類的適配器,經過類的繼承實現,下面是適配器類 Adapter,經過繼承被適配者—— Adaptee,把被適配者的 API—— request 適配給目標接口—— ITarget 的 API—— doTargetRequesturl

public class Adapter extends Adaptee implements ITarget { // 類的適配器:Adapter(經過繼承實現)
    @Override
    public void doTargetRequest() {
        // 這裏能夠寫一些業務代碼,若是有參數,就是對參數的轉換過程

        super.request(); // 經過 Adapter,把被適配者的API——request,適配給了目標接口——doTargetRequest。實現了對既有代碼的複用

        // 這裏能夠寫一些業務代碼
    }
}

客戶端調用spa

public class Main {
    public static void main(String[] args) {
        ITarget target = new NewTarget();
        target.doTargetRequest(); // NewTarget的目標方法:doRequest
        ITarget iTarget = new Adapter();
        iTarget.doTargetRequest(); // 被適配的類:request
    }
} 

類適配器的類圖

對象的適配器

類適配器經過繼承被適配的類實現,而對象的適配器,經過組合被適配的類的引用實現code

Itarget接口,Adaptee 類都不變,適配器類以下:htm

public class Adapter2 implements ITarget {
    private Adaptee adaptee; // 經過組合的方式

    public Adapter2(Adaptee adaptee) {
        this.adaptee = adaptee;
    }

    @Override
    public void doTargetRequest() {
        // 這裏能夠寫一些業務代碼,若是有參數,就是對參數的轉換過程
        this.adaptee.request(); // 實現了對既有代碼的複用,經過 Adapter,把被適配者的API——request,適配給了目標接口——doTargetRequest
        // 這裏能夠寫一些業務代碼
    }
}

客戶端調用對象

public class Main2 {
    public static void main(String[] args) {
        ITarget target = new NewTarget();
        target.doTargetRequest(); // NewTarget的目標方法:doRequest
        Adaptee adaptee = new Adaptee();
        ITarget iTarget = new Adapter2(adaptee);
        iTarget.doTargetRequest(); // 被適配的類:request
    }
} 

對象適配器的類圖

適配器使用場景

若是一個類已經穩定存在了,不想修改它,可是還要爲其增長新需求,且這個需求和類的現有接口不能徹底匹配,那麼就可使用適配器模式實現接口的轉換以便知足新需求。blog

或者是爲兩個已有的接口提供一種協同工做方式。

還有一種使用狀況,好比軟件版本的升級和向後兼容,一些 API都會用到適配器模式。

這也是標題的意思——接口轉換的利器。

適配器優缺點

優勢很直接,就是提升類的的穩定性,加強其複用性,在不改變現有類的前提下,拓展類的功能,且能解耦目標類和適配器類,符合了開閉原則。

缺點就是會增長系統複雜度,其實我我的以爲微不足道

適配器模式和外觀模式很像

外觀模式是爲舊接口(通常是比較複雜的接口),提供一個對外的簡單接口,或者說更方便使用的訪問入口。外觀模式參考:爲複雜系統提供一個對外窗口的方案——外觀模式總結

適配器模式是讓兩個已有的接口協同工做

更通常的看,外觀模式也是一種特殊的適配器,只不過它適配的是整個系統(粒度更大一些),爲一個系統提供一個方便訪問的對外接口。

適配器模式和裝飾模式的區別

適配器模式用來轉換不一樣接口,使舊接口和新接口能無縫銜接

裝飾模式不會改變接口,只是給接口增長新功能

JDK 中使用適配器的類

最多見的有 I/O 包裏的字符包裝流,InputStreamReader、OutputStreamWriter 等,還有util 包裏的Arrays.asList() 方法。

相關文章
相關標籤/搜索