站長(zhǎng)資訊網(wǎng)
        最全最豐富的資訊網(wǎng)站

        Java設(shè)計(jì)模式解析之適配器模式(實(shí)例詳解)

        本篇文章給大家?guī)?lái)了關(guān)于java的相關(guān)知識(shí),其中主要介紹了設(shè)計(jì)模式相關(guān)問(wèn)題,主要講了其中的適配器模式,適配器模式主要用于將一個(gè)類(lèi)的接口轉(zhuǎn)化成客戶端希望的目標(biāo)類(lèi)格式,使得原本不兼容的類(lèi)可以在一起工作,將目標(biāo)類(lèi)和適配者類(lèi)解耦,希望對(duì)大家有幫助。

        Java設(shè)計(jì)模式解析之適配器模式(實(shí)例詳解)

        推薦學(xué)習(xí):《java視頻教程》

        一、什么是適配器模式:

        適配器模式主要用于將一個(gè)類(lèi)的接口轉(zhuǎn)化成客戶端希望的目標(biāo)類(lèi)格式,使得原本不兼容的類(lèi)可以在一起工作,將目標(biāo)類(lèi)和適配者類(lèi)解耦;同時(shí)也符合“開(kāi)閉原則”,可以在不修改原代碼的基礎(chǔ)上增加新的適配器類(lèi);將具體的實(shí)現(xiàn)封裝在適配者類(lèi)中,對(duì)于客戶端類(lèi)來(lái)說(shuō)是透明的,而且提高了適配者的復(fù)用性,但是缺點(diǎn)在于更換適配器的實(shí)現(xiàn)過(guò)程比較復(fù)雜。

        所以,適配器模式比較適合以下場(chǎng)景:

        • (1)系統(tǒng)需要使用現(xiàn)有的類(lèi),而這些類(lèi)的接口不符合系統(tǒng)的接口。
        • (2)使用第三方組件,組件接口定義和自己定義的不同,不希望修改自己的接口,但是要使用第三方組件接口的功能。

        下面兩個(gè)非常形象的例子很好地說(shuō)明了什么是適配器模式:

        Java設(shè)計(jì)模式解析之適配器模式(實(shí)例詳解)

        Java設(shè)計(jì)模式解析之適配器模式(實(shí)例詳解)

        二、適配器模式的三種實(shí)現(xiàn)方式:

        適配器模式主要分成三類(lèi):類(lèi)的適配器模式、對(duì)象的適配器模式、接口的適配器模式。

        1、類(lèi)的適配器模式:

        Java設(shè)計(jì)模式解析之適配器模式(實(shí)例詳解)

        • 目標(biāo)接口(Target):客戶所期待的接口。目標(biāo)可以是具體的或抽象的類(lèi),也可以是接口。
        • 需要適配的類(lèi)(Adaptee):需要適配的類(lèi)或適配者類(lèi)。
        • 適配器(Adapter):通過(guò)包裝一個(gè)需要適配的對(duì)象,把原接口轉(zhuǎn)換成目標(biāo)接口。
        // 已存在的、具有特殊功能、但不符合我們既有的標(biāo)準(zhǔn)接口的類(lèi) class Adaptee { 	public void specificRequest() { 		System.out.println("被適配類(lèi)具有 特殊功能..."); 	} }   // 目標(biāo)接口,或稱(chēng)為標(biāo)準(zhǔn)接口 interface Target { 	public void request(); }   // 具體目標(biāo)類(lèi),只提供普通功能 class ConcreteTarget implements Target { 	public void request() { 		System.out.println("普通類(lèi) 具有 普通功能..."); 	} }   // 適配器類(lèi),繼承了被適配類(lèi),同時(shí)實(shí)現(xiàn)標(biāo)準(zhǔn)接口 class Adapter extends Adaptee implements Target{ 	public void request() { 		super.specificRequest(); 	} }   // 測(cè)試類(lèi)public class Client { 	public static void main(String[] args) { 		// 使用普通功能類(lèi) 		Target concreteTarget = new ConcreteTarget(); 		concreteTarget.request(); 		 		// 使用特殊功能類(lèi),即適配類(lèi) 		Target adapter = new Adapter(); 		adapter.request(); 	} }

        運(yùn)行結(jié)果:

        普通類(lèi) 具有 普通功能... 被適配類(lèi)具有 特殊功能...

        2、對(duì)象的適配器模式:

        Java設(shè)計(jì)模式解析之適配器模式(實(shí)例詳解)

        // 適配器類(lèi),直接關(guān)聯(lián)被適配類(lèi),同時(shí)實(shí)現(xiàn)標(biāo)準(zhǔn)接口 class Adapter implements Target{ 	// 直接關(guān)聯(lián)被適配類(lèi) 	private Adaptee adaptee; 	 	// 可以通過(guò)構(gòu)造函數(shù)傳入具體需要適配的被適配類(lèi)對(duì)象 	public Adapter (Adaptee adaptee) { 		this.adaptee = adaptee; 	} 	 	public void request() { 		// 這里是使用委托的方式完成特殊功能 		this.adaptee.specificRequest(); 	} }   // 測(cè)試類(lèi) public class Client { 	public static void main(String[] args) { 		// 使用普通功能類(lèi) 		Target concreteTarget = new ConcreteTarget(); 		concreteTarget.request(); 		 		// 使用特殊功能類(lèi),即適配類(lèi), 		// 需要先創(chuàng)建一個(gè)被適配類(lèi)的對(duì)象作為參數(shù) 		Target adapter = new Adapter(new Adaptee()); 		adapter.request(); 	} }

        測(cè)試結(jié)果與上面的一致。從類(lèi)圖中我們也知道需要修改的只不過(guò)就是 Adapter 類(lèi)的內(nèi)部結(jié)構(gòu),即 Adapter 自身必須先擁有一個(gè)被適配類(lèi)的對(duì)象,再把具體的特殊功能委托給這個(gè)對(duì)象來(lái)實(shí)現(xiàn)。使用對(duì)象適配器模式,可以使得 Adapter 類(lèi)(適配類(lèi))根據(jù)傳入的 Adaptee 對(duì)象達(dá)到適配多個(gè)不同被適配類(lèi)的功能,當(dāng)然,此時(shí)我們可以為多個(gè)被適配類(lèi)提取出一個(gè)接口或抽象類(lèi)。這樣看起來(lái)的話,似乎對(duì)象適配器模式更加靈活一點(diǎn)。

        3、接口的適配器模式:

        有時(shí)我們寫(xiě)的一個(gè)接口中有多個(gè)抽象方法,當(dāng)我們寫(xiě)該接口的實(shí)現(xiàn)類(lèi)時(shí),必須實(shí)現(xiàn)該接口的所有方法,這明顯有時(shí)比較浪費(fèi),因?yàn)椴⒉皇撬械姆椒ǘ际俏覀冃枰?,有時(shí)只需要某一些,此處為了解決這個(gè)問(wèn)題,我們引入了接口的適配器模式,借助于一個(gè)抽象類(lèi),該抽象類(lèi)實(shí)現(xiàn)了該接口,實(shí)現(xiàn)了所有的方法,而我們不和原始的接口打交道,只和該抽象類(lèi)取得聯(lián)系,所以我們寫(xiě)一個(gè)類(lèi),繼承該抽象類(lèi),重寫(xiě)我們需要的方法就行??匆幌骂?lèi)圖:

        Java設(shè)計(jì)模式解析之適配器模式(實(shí)例詳解)

        這個(gè)很好理解,在實(shí)際開(kāi)發(fā)中,我們也常會(huì)遇到這種接口中定義了太多的方法,以致于有時(shí)我們?cè)谝恍?shí)現(xiàn)類(lèi)中并不是都需要??创a:

        public interface Sourceable { 	 	public void method1(); 	public void method2(); }

        抽象類(lèi)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(); 	} }

        運(yùn)行結(jié)果:

        the sourceable interface's first Sub1! the sourceable interface's second Sub2!

        推薦學(xué)習(xí):《java視頻教程》

        贊(0)
        分享到: 更多 (0)
        網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)
        主站蜘蛛池模板: 亚洲AV蜜桃永久无码精品| 国产精品天干天干综合网| 国产人妖乱国产精品人妖| 国产精品偷伦视频免费观看了 | 精品久久久久久成人AV| 久久精品国产72国产精福利| 欧美精品国产日韩综合在线| 九九精品99久久久香蕉| 亚洲精品国产高清不卡在线 | 国产精品单位女同事在线| 久久国产免费观看精品| 99久久精品午夜一区二区| 无码国产精品一区二区免费式芒果 | 精品无码人妻一区二区三区不卡 | 99re6在线视频精品免费| 日韩人妻精品无码一区二区三区 | 日韩精品一区二区三区视频| 国产精品美女久久久网AV| 久久精品国产半推半就| 国产91精品一区二区麻豆网站| 日产精品一线二线三线芒果| 亚洲精品无码久久久| 久久久久人妻精品一区三寸蜜桃| 91精品成人免费国产片| 精品视频第一页| 精品一区二区久久久久久久网站| 精品国产AV一区二区三区| 日韩精品无码久久久久久| 亚洲精品国产精品乱码不99 | 精品四虎免费观看国产高清午夜 | 欧美成人精品一区二区综合| 久草欧美精品在线观看| 精品国产AⅤ一区二区三区4区| 国产精品午夜免费观看网站| 国产精品久久久久乳精品爆| 国产精品午夜一级毛片密呀| 国产香蕉国产精品偷在线观看| 国产成人精品免高潮在线观看| 国产叼嘿久久精品久久| 国产精品秘入口福利姬网站| 国内精品久久久久久久影视麻豆|