? ?? ???適配器模式將某個類的接口轉(zhuǎn)換成客戶端期望的另一個接口表示,目的是消除由于接口不匹配所造成的類的兼容性問題。主要分為三類:類的適配器模式沼溜、對象的適配器模式、接口的適配器模式客税。
?一况褪、類的適配器模式:假設(shè)有一個Source類撕贞,擁有一個方法,待適配测垛,目標(biāo)接口時Targetable捏膨,通過Adapter類,將Source的功能擴(kuò)展到Targetable里食侮。
public class Source {
? ? ? ? public void method1() {
? ? ? ? ? ? ? ? System.out.println("this is original method!");
? ? ? ? }
}
public interface Targetable {
? ? ? ? /* 與原類中的方法相同 */
? ? ? ? public void method1();
? ? ? ? /* 新類的方法 */
? ? ? ? public void method2();
}
public class Adapter extends Source implements Targetable {
? ? ? ? @Override
? ? ? ? public void method2() {
? ? ? ? ? ? ? ? System.out.println("this is the targetable method!");
? ? ? ? }
}
Adapter類繼承Source類号涯,實(shí)現(xiàn)Targetable接口,下面是測試類:
public class AdapterTest {
? ? ? ? public static void main(String[] args) {
? ? ? ? ? ? ? ? Targetable target = new Adapter();
? ? ? ? ? ? ? ? target.method1();
? ? ? ? ? ? ? ? target.method2();
? ? ? ? }
}
輸出:
this is original method!
this is the targetable method!
這樣Targetable接口的實(shí)現(xiàn)類就具有了Source類的功能锯七。
? ???二链快、對象適配器模式:基本思路和類的適配器模式相同,只是將Adapter類作修改眉尸,這次不繼承Source類域蜗,而是持有Source類的實(shí)例,以達(dá)到解決兼容性的問題噪猾。只需要修改Adapter類的源碼即可霉祸。
? ?public class Wrapper implements Targetable {
? ? ? ? private Source source;
?????????public Wrapper(Source source){
? ? ? ? ? ? ? ? super();
? ? ? ? ? ? ? ? this.source = source;
? ? ? ? }
? ? ? ? @Override
? ? ? ? public void method2() {
? ? ? ? ? ? ? ? System.out.println("this is the targetable method!");
? ? ? ? }
? ? ? ? @Override
? ? ? ? public void method1() {
? ? ? ? ? ? ? ? source.method1();
? ? ? ? }
}
測試類:
? ?public class AdapterTest {
? ? ? ? public static void main(String[] args) {
? ? ? ? ? ? ? ? Source source = new Source();
? ? ? ? ? ? ? ? Targetable target = new Wrapper(source);
? ? ? ? ? ? ? ? target.method1();
? ? ? ? ? ? ? ? target.method2();
? ? ? ? }
}
輸出與第一種一樣,只是適配的方法不同而已袱蜡。
? ?? ? 三丝蹭、接口適配器模式:接口的適配器是這樣的,有時我們寫的一個接口中有多個抽象方法坪蚁,當(dāng)我們寫該接口的實(shí)現(xiàn)類時奔穿,必須實(shí)現(xiàn)該接口的所有方法镜沽,這明顯有時比較浪費(fèi),因?yàn)椴⒉皇撬械姆椒ǘ际俏覀冃枰募铮袝r只需要某一些淘邻,此處為了解決這個問題,我們引入了接口的適配器模式湘换,借助于一個抽象類宾舅,該抽象類實(shí)現(xiàn)了該接口,實(shí)現(xiàn)了所有的方法彩倚,而我們不和原始的接口打交道筹我,只和該抽象類取得聯(lián)系,所以我們寫一個類帆离,繼承該抽象類蔬蕊,重寫我們需要的方法就行。這個很好理解哥谷,在實(shí)際開發(fā)中岸夯,我們也常會遇到這種接口中定義了太多的方法,以致于有時我們在一些實(shí)現(xiàn)類中并不是都需要们妥。
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 method2(){
? ? ? ? ? ? ? ? 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!
達(dá)到了我們的效果猜扮!
講了這么多,總結(jié)一下三種適配器模式的應(yīng)用場景:
類的適配器模式:當(dāng)希望將一個類轉(zhuǎn)換成滿足另一個新接口的類時监婶,可以使用類的適配器模式旅赢,創(chuàng)建一個新類,繼承原有的類惑惶,實(shí)現(xiàn)新的接口即可煮盼。
對象的適配器模式:當(dāng)希望將一個對象轉(zhuǎn)換成滿足另一個新接口的對象時,可以創(chuàng)建一個Wrapper類带污,持有原類的一個實(shí)例僵控,在Wrapper類的方法中,調(diào)用實(shí)例的方法就行鱼冀。
接口的適配器模式:當(dāng)不希望實(shí)現(xiàn)一個接口中所有的方法時报破,可以創(chuàng)建一個抽象類Wrapper,實(shí)現(xiàn)所有方法雷绢,我們寫別的類的時候泛烙,繼承抽象類即可。