在現實生活中,常常出現兩個對象因接口不兼容而不能在一塊兒工做的實例,這時須要第三者進行適配。例如,講中文的人同講英文的人對話時須要一個翻譯,用直流電的筆記本電腦接交流電源時須要一個電源適配器,用計算機訪問照相機的 SD 內存卡時須要一個讀卡器等。java
在軟件設計中也可能出現:須要開發的具備某種業務功能的組件在現有的組件庫中已經存在,但它們與當前系統的接口規範不兼容,若是從新開發這些組件成本又很高,這時用適配器模式能很好地解決這些問題。app
適配器模式(Adapter Pattern):將一個接口轉換成客戶但願的另外一個接口,使接口不兼容的那些類能夠一塊兒工做,其別名爲包裝器(Wrapper)。適配器模式既能夠做爲類結構型模式,也能夠做爲對象結構型模式。測試
在適配器模式中,咱們經過增長一個新的適配器類來解決接口不兼容的問題,使得本來沒有任何關係的類能夠協同工做。this
根據適配器類與適配者類的關係不一樣,適配器模式可分爲對象適配器和類適配器兩種,在對象適配器模式中,適配器與適配者之間是關聯關係;在類適配器模式中,適配器與適配者之間是繼承(或實現)關係。翻譯
適配器模式(Adapter)包含如下主要角色。設計
類適配器模式的結構圖以下圖所示3d
類適配器模式示例代碼:code
咱們能夠舉一個手機充電器的例子,通常手機充電的額定電壓是5V,然而家用電電壓是220V。這時候手機充電器就起到了一個適配器的做用,將220V的電壓轉成5V的電壓。對象
建立目標(Target)接口類即手機須要的額定電壓5V類blog
public interface Voltage5V { public int outPut5V(); }
建立適配者(Adaptee)類即家用電壓220V類,這個類就是須要被適配器適配的類。
public class Voltage220V { public int outPut220V(){ int Voltage = 220; return Voltage; } }
建立適配器(Adapter)類
public class VoltageAdapter extends Voltage220V implements Voltage5V { public int outPut5V() { int v = this.outPut220V(); //假設這裏進行了電壓適配 v = 5; return v; } }
建立手機類
public class Phone { public void charging(Voltage5V v){ if (v.outPut5V()==5){ System.out.println("電壓爲5V,能夠充電!"); }else{ System.out.println("電壓不匹配"); } } }
測試類
public class Client { public static void main(String[] args) { Phone phone = new Phone(); phone.charging(new VoltageAdapter()); } } /** 電壓爲5V,能夠充電! */
對象適配器模式和類適配器模式大同小異,只是適配器類再也不是繼承適配者類而是聚合了適配者類
對象適配器模式的結構圖以下圖所示
將上面的例子改成對象適配器模式
只須要修改適配器類便可
public class VoltageAdapter implements Voltage5V { private Voltage220V voltage220V; public VoltageAdapter(Voltage220V v){ voltage220V = v; } public int outPut5V() { if (null!=voltage220V) { int v = voltage220V.outPut220V(); //假設這裏進行了電壓適配 v = 5; return v; }else{ throw new RuntimeException(); } } }
缺省適配器模式(Default Adapter Pattern):當不須要實現一個接口所提供的全部方法時,可先設計一個抽象類實現該接口,併爲接口中每一個方法提供一個默認實現(空方法),那麼該抽象類的子類能夠選擇性地覆蓋父類的某些方法來實現需求,它適用於不想使用一個接口中的全部方法的狀況,又稱爲單接口適配器模式。缺省適配器模式是適配器模式的一種變體,其應用也較爲普遍。