說到適配器,小秋第一想到的是咱們電腦的電源適配器,它可以將220v,110v等不一樣電壓轉換爲咱們電腦須要的電壓值供電腦使用,那麼你知道適配器模式是怎樣實現的嗎,下面就和小秋一塊兒探索一下適配器的工做模式吧html
將一個類的接口轉換成客戶但願的另外一個接口java
一般狀況下,客戶端能夠經過目標類的接口訪問它所提供的服務。有時,現有的類能夠知足客戶類的功能須要,可是它所提供的接口不必定是客戶類所指望的,這多是由於現有類中方法名與目標類中定義的方法名不一致等緣由所致使的。數據庫
經過多重繼承將apdatee2接口與target接口進行匹配,將適配的類apdatee2的API轉換成爲目標類的API設計模式
因爲適配器直接繼承了Adaptee,使得適配器不能和Adaptee的子類一塊兒工做,由於繼承是靜態的關係,當適配器繼承了Adaptee後,就不可能再去處理 Adaptee的子類了ide
被適配的類的API轉換成爲目標類的API,與類的適配器模式不一樣的是,對象的適配器模式不是使用繼承關係鏈接到Adaptee類而是使用委派關係鏈接到Adaptee類工具
目標接口(客戶端調用的接口)this
package adapter; //目標接口(客戶端須要使用的接口) public interface Target { //客戶端須要請求處理的方法 public void request(); }
源接口(須要被適配的接口)spa
package adapter; //源接口(已經存在的接口) //須要被轉換的對象 //這個接口須要從新配置以適應目標接口 public class Adaptee { public void specifiRequest() { System.out.println("源接口對象調用源接口中的方法"); } }
適配器設計
package adapter; public class Adapter implements Target { //持有源接口對象 private Adaptee adaptee; /** * 構造方法,傳入須要被適配的對象 * @param adaptee */ public Adapter(Adaptee adaptee) { this.adaptee = adaptee; } /** * 重寫目標接口的方法,以適應客戶端的需求 */ @Override public void request() { //調用源接口的方法 System.out.println("適配器包裝源接口對象,調用源接口的方法"); adaptee.specifiRequest(); } }
客戶端代理
package adapter; public class Client { public static void main(String[] args){ //建立源對象(被適配的對象) Adaptee adaptee = new Adaptee(); //利用源對象對象一個適配器對象,提供客戶端調用的方法 Adapter adapter = new Adapter(adaptee); System.out.println("客戶端調用適配器中的方法"); adapter.request(); } } //客戶端調用適配器中的方法 //適配器包裝源接口對象,調用源接口的方法 //源接口對象調用源接口中的方法
目標類和適配者類解耦,增長了類的透明性和複用性,同時系統的靈活性和擴展性都很是好,更換適配器或者增長新的適配器都很是方便,符合「開閉原則」
過多的使用適配器,會讓系統很是零亂,不易總體進行把握。好比,明明看到調用的是A接口,其實內部被適配成了B接口的實現
Java語言的數據庫鏈接工具JDBC,JDBC給出一個客戶端通用的抽象接口,每個具體數據庫引擎(如SQL Server、Oracle、MySQL等)的JDBC驅動軟件都是一個介於JDBC接口和數據庫引擎接口之間的適配器軟件
想要複用一些現有的類,可是接口與複用環境要求不一致
適配器模式
裝飾器模式
'裝飾模式與適配器模式是不衝突的,能夠既加強原有功能,又添加全新的功能。
最後附上一張適配器的概覽圖