適配器模式的定義很簡單,就是作一箇中間轉換,相似港版的 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都會用到適配器模式。
這也是標題的意思——接口轉換的利器。
優勢很直接,就是提升類的的穩定性,加強其複用性,在不改變現有類的前提下,拓展類的功能,且能解耦目標類和適配器類,符合了開閉原則。
缺點就是會增長系統複雜度,其實我我的以爲微不足道
外觀模式是爲舊接口(通常是比較複雜的接口),提供一個對外的簡單接口,或者說更方便使用的訪問入口。外觀模式參考:爲複雜系統提供一個對外窗口的方案——外觀模式總結
適配器模式是讓兩個已有的接口協同工做
更通常的看,外觀模式也是一種特殊的適配器,只不過它適配的是整個系統(粒度更大一些),爲一個系統提供一個方便訪問的對外接口。
適配器模式用來轉換不一樣接口,使舊接口和新接口能無縫銜接
裝飾模式不會改變接口,只是給接口增長新功能
最多見的有 I/O 包裏的字符包裝流,InputStreamReader、OutputStreamWriter 等,還有util 包裏的Arrays.asList() 方法。