前言
適配器模式的定義很簡單,就是做一個中間轉換,類似港版的 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電子書,資料,幫忙內推,歡迎拍磚!