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


前言

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

直接上代碼,很簡單,不多總結了。

類的適配器

被適配的類,可以看成是一個舊系統里的穩定的類

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

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

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—— doTargetRequest

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

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

        // 這里可以寫一些業務代碼
    }
}

客戶端調用

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

類適配器的類圖

對象的適配器

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

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

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
    }
} 

對象適配器的類圖

適配器使用場景

如果一個類已經穩定存在了,不想修改它,但是還要為其增加新需求,且這個需求和類的現有接口不能完全匹配,那么就可以使用適配器模式實現接口的轉換以便滿足新需求。

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

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

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

適配器優缺點

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

缺點就是會增加系統復雜度,其實我個人覺得微不足道

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

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

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

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

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

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

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

JDK 中使用適配器的類

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

歡迎關注

dashuai的博客是終身學習踐行者,大廠程序員,且專注於工作經驗、學習筆記的分享和日常吐槽,包括但不限於互聯網行業,附帶分享一些PDF電子書,資料,幫忙內推,歡迎拍磚!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM