您好,登錄后才能下訂單哦!
本篇內容介紹了“Java設計模式解析之適配器模式怎么實現”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
適配器模式主要用于將一個類的接口轉化成客戶端希望的目標類格式,使得原本不兼容的類可以在一起工作,將目標類和適配者類解耦;同時也符合“開閉原則”,可以在不修改原代碼的基礎上增加新的適配器類;將具體的實現封裝在適配者類中,對于客戶端類來說是透明的,而且提高了適配者的復用性,但是缺點在于更換適配器的實現過程比較復雜。
所以,適配器模式比較適合以下場景:
(1)系統需要使用現有的類,而這些類的接口不符合系統的接口。
(2)使用第三方組件,組件接口定義和自己定義的不同,不希望修改自己的接口,但是要使用第三方組件接口的功能。
下面兩個非常形象的例子很好地說明了什么是適配器模式:
適配器模式主要分成三類:類的適配器模式、對象的適配器模式、接口的適配器模式。
1、類的適配器模式:
目標接口(Target):客戶所期待的接口。目標可以是具體的或抽象的類,也可以是接口。
需要適配的類(Adaptee):需要適配的類或適配者類。
適配器(Adapter):通過包裝一個需要適配的對象,把原接口轉換成目標接口。
// 已存在的、具有特殊功能、但不符合我們既有的標準接口的類 class Adaptee { public void specificRequest() { System.out.println("被適配類具有 特殊功能..."); } } // 目標接口,或稱為標準接口 interface Target { public void request(); } // 具體目標類,只提供普通功能 class ConcreteTarget implements Target { public void request() { System.out.println("普通類 具有 普通功能..."); } } // 適配器類,繼承了被適配類,同時實現標準接口 class Adapter extends Adaptee implements Target{ public void request() { super.specificRequest(); } } // 測試類public class Client { public static void main(String[] args) { // 使用普通功能類 Target concreteTarget = new ConcreteTarget(); concreteTarget.request(); // 使用特殊功能類,即適配類 Target adapter = new Adapter(); adapter.request(); } }
運行結果:
普通類 具有 普通功能... 被適配類具有 特殊功能...
2、對象的適配器模式:
// 適配器類,直接關聯被適配類,同時實現標準接口 class Adapter implements Target{ // 直接關聯被適配類 private Adaptee adaptee; // 可以通過構造函數傳入具體需要適配的被適配類對象 public Adapter (Adaptee adaptee) { this.adaptee = adaptee; } public void request() { // 這里是使用委托的方式完成特殊功能 this.adaptee.specificRequest(); } } // 測試類 public class Client { public static void main(String[] args) { // 使用普通功能類 Target concreteTarget = new ConcreteTarget(); concreteTarget.request(); // 使用特殊功能類,即適配類, // 需要先創建一個被適配類的對象作為參數 Target adapter = new Adapter(new Adaptee()); adapter.request(); } }
測試結果與上面的一致。從類圖中我們也知道需要修改的只不過就是 Adapter 類的內部結構,即 Adapter 自身必須先擁有一個被適配類的對象,再把具體的特殊功能委托給這個對象來實現。使用對象適配器模式,可以使得 Adapter 類(適配類)根據傳入的 Adaptee 對象達到適配多個不同被適配類的功能,當然,此時我們可以為多個被適配類提取出一個接口或抽象類。這樣看起來的話,似乎對象適配器模式更加靈活一點。
3、接口的適配器模式:
有時我們寫的一個接口中有多個抽象方法,當我們寫該接口的實現類時,必須實現該接口的所有方法,這明顯有時比較浪費,因為并不是所有的方法都是我們需要的,有時只需要某一些,此處為了解決這個問題,我們引入了接口的適配器模式,借助于一個抽象類,該抽象類實現了該接口,實現了所有的方法,而我們不和原始的接口打交道,只和該抽象類取得聯系,所以我們寫一個類,繼承該抽象類,重寫我們需要的方法就行。看一下類圖:
這個很好理解,在實際開發中,我們也常會遇到這種接口中定義了太多的方法,以致于有時我們在一些實現類中并不是都需要。看代碼:
public interface Sourceable { public void method1(); public void method2(); }
抽象類Wrapper2:
public abstract class Wrapper2 implements Sourceable{ public void method1(){} public void method2(){} } public class SourceSub1 extends Wrapper2 { public void method1(){ System.out.println("the sourceable interface's first Sub1!"); } } public class SourceSub2 extends Wrapper2 { public void method1(){ System.out.println("the sourceable interface's second Sub2!"); } }
public class WrapperTest { public static void main(String[] args) { Sourceable source1 = new SourceSub1(); Sourceable source2 = new SourceSub2(); source1.method1(); source1.method2(); source2.method1(); source2.method2(); } }
運行結果:
the sourceable interface's first Sub1! the sourceable interface's second Sub2!
“Java設計模式解析之適配器模式怎么實現”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。