Java 適配器模式
最近學習java 基礎知識,學習適配器的時候疑惑很多,上網查下資料,對於Adapter的資料很多,但是比較下本篇不錯,這裡記錄下,大家需要的可以看下。
適配器模式就是把一個類的接口轉換成客戶端所期待的另外一種接口,從而使原接口不匹配而無法在一起工作的的兩個類能在一起工作。從功能上說,這些接口不兼容的類一般具有相同或相似的功能。通常我們通過修改該類的接口來解決這種接口不兼容的情形,但是如果我們不願意為了一個應用而修改各原接口,或者我們壓根兒就沒有對象的源代碼的時候,適配器模式就會派上用場了。
適配器的優點:
1、將目標類和適配者類解耦
2、增加了類的透明性和復用性,將具體的實現封裝在適配者類中,對於客戶端類來說是透明的,而且提高了適配者的複用性
3、靈活性和擴展性都非常好,符合開閉原則
適配器所涉及的角色包括下面幾種:
目標(Target):定義一個客戶端使用的特定接口。
客戶端(Client):使用目標接口,與和目標接口一致的對象合作。
被適配者(Adaptee):一個現存需要適配的接口。
適配器(Adapter):負責將Adaptee的接口轉換為Target的接口。適配器是一個具體的類,這是該模式的核心。
適配器分為類適配器和對象適配器兩種,下面將詳細講述。
類適配器
所謂類適配器,指的是適配器Adapter繼承我們的被適配者Adaptee,並實現目標接口Target。由於Java中是單繼承,所以這個適配器僅僅只能服務於所繼承的被適配者Adaptee。代碼如下:
被適配者(Adaptee)
package com.bluemsun.classadapter;public class Person { private int id; private String name; /** * person可以現在只能說英語*/ public void sayEnglish(){ System.out.println("Person can say english!"); } /** * 省略setter,getter. */}目標接口(Target)
package com.bluemsun.classadapter;/** * 目標要求person可以說英語,法語,日語.但是現在的person僅僅可以說英語* @author Administrator * */public interface Target_Person { void sayEnglish(); void sayFrench(); void sayJapanese();}適配器(Adapter)
package com.bluemsun.classadapter;/** * 類適配器,因為繼承了Person,而Java中只能單繼承,所以這個適配器只為person這一個類服務* 這個適配器就讓person類在不修改源碼的基礎上能實現目標接口所指定的方法* @author Administrator * */public class Adapter_Person extends Person implements Target_Person{ @Override public void sayFrench() { System.out.println("Person can say French!"); } @Override public void sayJapanese() { System.out.println("Person can say Japanese!"); }}客戶端(Client)
package com.bluemsun.classadapter;public class Test { public static void main(String[] args) { Target_Person person = new Adapter_Person(); person.sayEnglish(); person.sayFrench(); person.sayJapanese(); }}上面的幾段簡單代碼演示了類適配器的作用。正如我們開始所言,這個適配器Adapter只能為Person這一個類所服務。這時候你可能會想,要是我所需要適配的類很多,是不是都需要為每一個需要適配的類寫一個Adapter?有沒有更加靈活的方式呢?答案是:有!就是我們下面所講的對象適配器。
對象適配器
所謂對象適配器,簡單的說就是適配器實現我們的目標接口,但是並不繼承需要被適配的類。而是通過在適配器的構造函數中將需要被適配的類傳遞進來從而進行適配。代碼如下:(Target,Adaptee同上)
適配器(Adapter)
package com.bluemsun.objectdapter;import com.bluemsun.classadapter.Person;import com.bluemsun.classadapter.Target_Person;/** * 對象適配器,與類適配器不同的是:對象適配器可以適配多個源到目標* @author Administrator * */public class Adapter_Person implements Target_Person{ //僅僅實現目標接口private Person person; //在構造函數中將Adaptee類Person傳遞進來public Adapter_Person(Person person){ this.person = person; } //實現目標接口中的sayEnglish()--調用Adaptee中的sayEnglish() @Override public void sayEnglish() { this.person.sayEnglish(); } //實現接口中的其它方法@Override public void sayFrench() { System.out.println("person can say French!"); } @Override public void sayJapanese() { System.out.println("person can say Japanese!"); }}客戶端(Client)
package com.bluemsun.objectdapter;import com.bluemsun.classadapter.Person;import com.bluemsun.classadapter.Target_Person;public class Test { public static void main(String[] args) { Target_Person person = new Adapter_Person(new Person()); person.sayEnglish(); person.sayFrench(); person.sayJapanese(); }}對象適配器可以適配多個帶適配的類。只需要你在Adapter的構造方法中傳遞不同的帶適配的類即可。具有靈活性。
類適配器的優點:
1、由於適配器類是適配者類的子類,因此可以再適配器類中置換一些適配者的方法,使得適配器的靈活性更強。
類適配器的缺點:
1、對於Java、C#等不支持多重繼承的語言,一次最多只能適配一個適配者類,而且目標抽像類只能為接口,不能為類,其使用有一定的局限性,不能將一個適配者類和他的子類同時適配到目標接口。
對象適配器的優點:
1、把多個不同的適配者適配到同一個目標,也就是說,同一個適配器可以把適配者類和他的子類都適配到目標接口。
對象適配器的缺點:
1、與類適配器模式相比,要想置換適配者類的方法就不容易。
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!