適配器模式是一種使用頻率很是高的結構型設計模式,若是在系統中存在不兼容的接口,能夠經過引入一個適配器來使得本來由於接口不兼容二不能一塊兒工做的兩個類協同工做。html
我國的生活用電電壓是220V,而筆記本電腦、手機等電子設備的電壓都沒有這麼高。這時候就須要電源適配器,使得生活用電和筆記本電腦能夠兼容。軟件開發中採用相似電源適配器的設計和編碼技巧被稱爲適配器模式。有時,現有類所提供的接口不必定是用戶所期待的,使用適配器能夠對現有接口請求轉化爲客戶指望的接口請求。java
將一個接口轉換成客戶但願的另外一個接口,適配器模式使接口不兼容的那些類能夠一塊兒工做,其別名爲包裝器(Wrapper)。適配器模式既能夠做爲類結構型模式,也能夠做爲對象結構型模式。編程
適配器模式包含以下角色:設計模式
Target(目標抽象類)app
目標抽象類定義用戶要用的特定領域的接口,能夠是抽象類或接口,也能夠是具體類;在類適配器中,因爲Java語句不支持多重繼承,它只能是接口。學習
Adapter(適配器類)this
適配器類能夠調用一個另外一個接口,做爲一個轉換器,對Adaptee和Target進行適配。在類適配器中,它經過實現Target接口並繼承Adaptee類使兩者產生聯繫,在對象適配器中,經過繼承Target並關聯一個Adaptee對象使兩者產生聯繫。編碼
Adaptee(適配者類)設計
適配者即被適配角色,定義了一個已經存在的接口,這個接口須要適配,適配者類通常是一個具體類,包含了客戶但願使用的業務方法,在某些狀況下甚至沒有適配者類的源代碼。3d
Client(客戶類)
在客戶類中針對目標抽象類進行編程,調用在目標抽象類中定義的業務方法。
根據類適配器模式結構圖,適配者類Adaptee沒有request()方法,而客戶期待這個方法,但Adaptee中實現了specificRequest()方法,該方法所提供的實現正是客戶須要的。爲了知足客戶須要,適配器類Adapter實現抽象目標類接口並繼承適配者類,適配器類request()方法調用所繼承的適配者類的specificRequest()方法,實現適配的目的。
public class Adapter extends Adaptee implements Target { public void request() { specificRequest(); } }
客戶需求與上述相同,Adapter包裝了一個適配者類,在適配器的request()方法中調用適配者的specificRequest()方法。
public class Adapter extends Target { private Adaptee adaptee; public Adapter() { this.adaptee = adaptee; } public void request() { adaptee.specificRequest(); } }
當不須要所有實現接口提供的方法時,可先設計一個抽象類實現該接口,併爲接口中每一個方法提供一個默認實現(空方法),那麼該抽象類的子類有選擇地覆蓋父類的某些方法實現需求。在默認適配器中包含三個角色,分別是適配者接口、默認適配器類和具體業務類。
適配者接口
適配者是被適配的對象,接口中聲明瞭大量的方法
public interface ServiceInterface { public void serviceMethod1(); public void serviceMethod1(); public void serviceMethod1(); }
默認適配器類
默認適配器類使用空方法形式實如今接口中聲明的方法
public abstract class AbstractServiceClass implements ServiceInterface { public void serviceMethod1(){}; public void serviceMethod1(){}; public void serviceMethod1(){}; }
具體業務類
具體業務類是默認適配器類的子類,根據須要有選擇性地覆蓋在適配器類中定義的方法
public class ConcreteServiceClass extends AbstractServiceClass { public void serviceMethod1(){ //具體實現 }; public void serviceMethod1(){ //具體實現 }; }
若是在適配器中同時包含對目標類和適配者類的引用,適配者能夠經過它調用目標類中方法,目標類也能夠經過它調用適配器類中方法,那麼該適配器就是一個雙向適配器。