一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Java設計模式--適配器模式詳解

Java設計模式--適配器模式詳解

2021-12-23 13:02parroly Java教程

這篇文章主要介紹了java設計模式之適配器模式Adapter的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下

定義

適配器模式用于解決接口間的兼容問題。

當我們需要使用某個類提供的接口,但是這個接口與現在的系統需求不符,由于該接口是由第三方提供的,或者是已經在生產上跑了很久的存量類,我們不想通過改變這個類來滿足現在系統的需求,那么這時候就可以考慮通過將目標類封裝成一個滿足系統需求的新類,因此適配器(Adapter)也稱為包裝器(Wrapper)。

 

結構

適配器模式包含如下角色:

  • Target:目標抽象類,客戶類期望的接口。
  • Adapter:適配器類,適配器模式的核心,實現目標抽象類和適配者類的轉換。
  • Adaptee:適配者類,與目前需求不兼容的類,即需要被包裝的類。
  • Client:客戶類,調用在目標抽象類中定義的業務方法。

適配器模式有類適配器和對象適配器兩種實現:

1、在類適配器模式中,適配器類實現了目標抽象類接口并繼承了適配者類,在目標抽象類的實現方法中調用所繼承的適配者類的方法。

Java設計模式--適配器模式詳解

2、在對象適配器模式中,適配器類實現了目標抽象類并定義了一個適配者類的對象實例,在目標抽象類的實現方法中調用適配者類實例的方法。

Java設計模式--適配器模式詳解

 

示例

假如我們手上有一只手機,它只有一個type-c接口,同時手上有一條3.5mm的耳機,想聽音樂的時候就會發現二者不兼容,相較于更換手機或者耳機,一般我們會選擇一條type-c和3.5mm的轉接線來實現最高性價比。

此時將3.5mm耳機比作客戶端(客戶類),它期望得到音樂信號的目標是3.5mm接口(目標抽象類),type-c接口則是手機提供的音樂信號傳輸接口(適配者類),與耳機接頭不兼容,而轉接線(適配器類)可以將type-c接口包裝為耳機可以插入的3.5mm接口,能夠解決手機與耳機的不兼容問題,實現用耳機接收手機播放的音樂信號。

1、定義目標抽象類,即客戶類期望的接口。

public interface ThreePointFiveConn {
	//一個提供音樂的3.5mm接口
	public void playMusic(String connector);
}

2、定義適配者類,即需要被包裝的類。

public interface PlayMusicConn {
	public void playMusicOut(String connector);
}
public class TypecPlayMusicConn implements PlayMusicConn {
	//只允許typec接頭插入
	public void playMusicOut(String phoneConnType, String musicName) {
		if("typec".equals(phoneConnType)){
			//實現播放音樂功能
			System.out.println("playing music with typec Player..." + musicName);
		}else {
			System.out.println("error!");
		}
	}
}
public class LightningPlayMusicConn implements PlayMusicConn {
	//只允許Lightning接頭插入
	public void playMusicOut(String phoneConnType, String musicName) {
		if("lightning".equals(phoneConnType)){
			//實現播放音樂功能
			System.out.println("playing music with lightning Player..." + musicName);
		}else {
			System.out.println("error!");
		}
	}
}

類適配器模式:由于適配器類是適配者類的子類,因此可以在適配器類中重寫適配者類的方法,使得適配器類更具靈活性。

3、構建適配器類,將適配者類PlayMusicConn包裝為目標抽象類ThreePointFiveConn的一個子類。

public class Transverter extends TypecPlayMusicConn implements ThreePointFiveConn {
	//調用繼承的適配者類的方法
	public void playMusic(String musicName) {
		super.playMusicOut("typec", musicName);
	}
}

4、客戶端類(耳機)使用

public class EarPhone {
	public static void main(String[] args) {
		ThreePointFiveConn earPhone = new Transverter();
		earPhone.playMusic("Hey Jude");
	}
}

運行結果:

playing music with typec Player…Hey Jude

  • 對象適配器模式:一個對象適配器類可以把多個不同的適配者類及其子類適配到同一個目標抽象類,因此具有更大的兼容性。

3、構建適配器類,將適配者類PlayMusicConn包裝為目標抽象類ThreePointFiveConn的一個子類。

public class Transverter implements ThreePointFiveConn {
	//定義適配者類的對象實例
	private PlayMusicConn playMusicConn;
	public Transverter(PlayMusicConn playMusicConn){
		this.playMusicConn = playMusicConn;
	}
	public void playMusic(String musicName) {
		if(playMusicConn instanceof TypecPlayMusicConn) {
			playMusicConn.playMusicOut("typec", musicName);
		}else if(playMusicConn instanceof LightningPlayMusicConn) {
			playMusicConn.playMusicOut("lightning", musicName);
		}else {
			System.out.print("error!");
		}
	}
}

4、客戶端類(耳機)使用

public class EarPhone {
	public static void main(String[] args) {
		//typec接口手機播放音樂
		ThreePointFiveConn earPhone = new Transverter(new TypecPlayMusicConn());
		earPhone.playMusic("Hey Jude");
		//lightning接口手機播放音樂
		ThreePointFiveConn earPhone1 = new Transverter(new LightningPlayMusicConn());
		earPhone1.playMusic("Hey Jude");
	}
}

運行結果:

playing music with typec Player…Hey Jude
playing music with lightning Player…Hey Jude

 

擴展

除類適配器和對象適配器模式外,還有一種接口適配器模式。接口適配器模式是指在定義適配器時,先將其定義為一個抽象類實現接口,接口中定義了多個抽象方法,定義該適配器的子類時,子類只實現其中的部分抽象方法。

它適用于一個接口不想使用其所有的方法的情況。因此也稱為單接口適配器模式。

public abstract class TransverterInterface implements ThreePointFiveConn {
	PlayMusicConn playMusicConn = new TypecPlayMusicConn();
	public void playMusic(String musicName) {
		playMusicConn.playMusicOut("typec", musicName);
	}
	public void anotherMethod1(){}
	public void anotherMethod2(){}
}
public class TransverterInterfaceImpl extends TransverterInterface {
	public void playMusic(String musicName) {
		super.playMusic(musicName);
	}
}

 

總結

適配器模式的主要優點是將目標類和適配者類解耦,增加了類的透明性和復用性,同時系統的靈活性和擴展性都非常好,更換適配器或者增加新的適配器都非常方便,符合“開閉原則”。

適配器模式適用情況包括:系統需要使用現有的類,而這些類的接口不符合系統的需要;想要建立一個可以重復使用的類,用于與一些彼此之間沒有太大關聯的一些類一起工作。

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注服務器之家的更多內容!

原文鏈接:https://blog.csdn.net/sinat_37623490/article/details/120028431

延伸 · 閱讀

精彩推薦
  • Java教程xml與Java對象的轉換詳解

    xml與Java對象的轉換詳解

    這篇文章主要介紹了xml與Java對象的轉換詳解的相關資料,需要的朋友可以參考下...

    Java教程網2942020-09-17
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關于小米推送Java代碼,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧...

    富貴穩中求8032021-07-12
  • Java教程Java8中Stream使用的一個注意事項

    Java8中Stream使用的一個注意事項

    最近在工作中發現了對于集合操作轉換的神器,java8新特性 stream,但在使用中遇到了一個非常重要的注意點,所以這篇文章主要給大家介紹了關于Java8中S...

    阿杜7482021-02-04
  • Java教程升級IDEA后Lombok不能使用的解決方法

    升級IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級,尋思已經有好久沒有升過級了。升級完畢重啟之后,突然發現好多錯誤,本文就來介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程20個非常實用的Java程序代碼片段

    20個非常實用的Java程序代碼片段

    這篇文章主要為大家分享了20個非常實用的Java程序片段,對java開發項目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
  • Java教程Java實現搶紅包功能

    Java實現搶紅包功能

    這篇文章主要為大家詳細介紹了Java實現搶紅包功能,采用多線程模擬多人同時搶紅包,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙...

    littleschemer13532021-05-16
  • Java教程Java BufferWriter寫文件寫不進去或缺失數據的解決

    Java BufferWriter寫文件寫不進去或缺失數據的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進去或缺失數據的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望...

    spcoder14552021-10-18
主站蜘蛛池模板: 国产国语videosex另类 | 免费在线观看网址大全 | 特级毛片免费视频观看 | 亚洲v成人天堂影视 | 免费看又黄又爽又猛的视频软件- | 精品视频一区二区三区 | 亚洲小视频在线 | 极品美女写真菠萝蜜视频 | 国产1区2区三区不卡 | 日韩一区二区三区四区不卡 | 处女私拍 | 美女和男生搞基 | 亚洲乱亚洲乱妇41p 亚洲乱码一区二区三区国产精品 | 欧美人交性视频在线香蕉 | 男人扒开女人下身添 | 成人午夜视频一区二区国语 | 亚洲www在线 | 国产精品成人在线播放 | 女娃开嫩苞经历小说 | 日韩一区在线观看 | 丝袜老师好湿好紧我要进去了 | 日本h乱淫动漫在线观看 | 亚洲国产综合久久久无码色伦 | 成人免费视频在 | 呜呜别塞了啊抽插 | 无限韩国视频免费播放 | 欧美一区二区三区不卡视频 | 国产精品视频色拍拍 | 169pp美女| 胸奶好大好紧好湿好爽 | 亚洲国产精品网站久久 | 小兰被扒开内裤露出p | 成年性生交大片免费看 | 四虎影视色费永久在线观看 | www视频在线免费观看 | 国产综合欧美日韩视频一区 | 欧美成人另类人妖 | 99在线精品免费视频九九视 | 草草视频免费观看 | 久久婷婷五月综合色丁香花 | 亚洲人成综合在线播放 |