最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java設(shè)計(jì)模式--適配器模式詳解

 更新時(shí)間:2021年09月08日 10:22:46   作者:parroly  
這篇文章主要介紹了java設(shè)計(jì)模式之適配器模式Adapter的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

定義

適配器模式用于解決接口間的兼容問(wèn)題。

當(dāng)我們需要使用某個(gè)類提供的接口,但是這個(gè)接口與現(xiàn)在的系統(tǒng)需求不符,由于該接口是由第三方提供的,或者是已經(jīng)在生產(chǎn)上跑了很久的存量類,我們不想通過(guò)改變這個(gè)類來(lái)滿足現(xiàn)在系統(tǒng)的需求,那么這時(shí)候就可以考慮通過(guò)將目標(biāo)類封裝成一個(gè)滿足系統(tǒng)需求的新類,因此適配器(Adapter)也稱為包裝器(Wrapper)。

結(jié)構(gòu)

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

  • Target:目標(biāo)抽象類,客戶類期望的接口。
  • Adapter:適配器類,適配器模式的核心,實(shí)現(xiàn)目標(biāo)抽象類和適配者類的轉(zhuǎn)換。
  • Adaptee:適配者類,與目前需求不兼容的類,即需要被包裝的類。
  • Client:客戶類,調(diào)用在目標(biāo)抽象類中定義的業(yè)務(wù)方法。

適配器模式有類適配器和對(duì)象適配器兩種實(shí)現(xiàn):

1、在類適配器模式中,適配器類實(shí)現(xiàn)了目標(biāo)抽象類接口并繼承了適配者類,在目標(biāo)抽象類的實(shí)現(xiàn)方法中調(diào)用所繼承的適配者類的方法。

在這里插入圖片描述

2、在對(duì)象適配器模式中,適配器類實(shí)現(xiàn)了目標(biāo)抽象類并定義了一個(gè)適配者類的對(duì)象實(shí)例,在目標(biāo)抽象類的實(shí)現(xiàn)方法中調(diào)用適配者類實(shí)例的方法。

在這里插入圖片描述

示例

假如我們手上有一只手機(jī),它只有一個(gè)type-c接口,同時(shí)手上有一條3.5mm的耳機(jī),想聽(tīng)音樂(lè)的時(shí)候就會(huì)發(fā)現(xiàn)二者不兼容,相較于更換手機(jī)或者耳機(jī),一般我們會(huì)選擇一條type-c和3.5mm的轉(zhuǎn)接線來(lái)實(shí)現(xiàn)最高性價(jià)比。

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

1、定義目標(biāo)抽象類,即客戶類期望的接口。

public interface ThreePointFiveConn {
	//一個(gè)提供音樂(lè)的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)){
			//實(shí)現(xiàn)播放音樂(lè)功能
			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)){
			//實(shí)現(xiàn)播放音樂(lè)功能
			System.out.println("playing music with lightning Player..." + musicName);
		}else {
			System.out.println("error!");
		}
	}
}

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

3、構(gòu)建適配器類,將適配者類PlayMusicConn包裝為目標(biāo)抽象類ThreePointFiveConn的一個(gè)子類。

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

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

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

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

playing music with typec Player…Hey Jude

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

3、構(gòu)建適配器類,將適配者類PlayMusicConn包裝為目標(biāo)抽象類ThreePointFiveConn的一個(gè)子類。

public class Transverter implements ThreePointFiveConn {
	//定義適配者類的對(duì)象實(shí)例
	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、客戶端類(耳機(jī))使用

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

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

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

擴(kuò)展

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

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

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);
	}
}

總結(jié)

適配器模式的主要優(yōu)點(diǎn)是將目標(biāo)類和適配者類解耦,增加了類的透明性和復(fù)用性,同時(shí)系統(tǒng)的靈活性和擴(kuò)展性都非常好,更換適配器或者增加新的適配器都非常方便,符合“開(kāi)閉原則”。

適配器模式適用情況包括:系統(tǒng)需要使用現(xiàn)有的類,而這些類的接口不符合系統(tǒng)的需要;想要建立一個(gè)可以重復(fù)使用的類,用于與一些彼此之間沒(méi)有太大關(guān)聯(lián)的一些類一起工作。

本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • Java 對(duì)稱加密幾種算法分別實(shí)現(xiàn)

    Java 對(duì)稱加密幾種算法分別實(shí)現(xiàn)

    這篇文章主要介紹了Java 對(duì)稱加密使用DES / 3DES / AES 這三種算法分別實(shí)現(xiàn)的相關(guān)資料,這里提供了實(shí)例代碼,需要的朋友可以參考下
    2017-01-01
  • Java中程序的運(yùn)行全過(guò)程

    Java中程序的運(yùn)行全過(guò)程

    這篇文章主要介紹了Java中程序的運(yùn)行全過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • HelloSpringMVC配置版實(shí)現(xiàn)步驟解析

    HelloSpringMVC配置版實(shí)現(xiàn)步驟解析

    這篇文章主要介紹了HelloSpringMVC配置版實(shí)現(xiàn)步驟解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • Spring Boot 中的靜態(tài)資源放置位置

    Spring Boot 中的靜態(tài)資源放置位置

    這篇文章主要介紹了Spring Boot 中的靜態(tài)資源到底要存放哪里,很多童鞋對(duì)這個(gè)問(wèn)題很糾結(jié),接下來(lái)通過(guò)本文給大家介紹下,需要的朋友可以參考下
    2019-04-04
  • SpringBoot之RabbitMQ的使用方法

    SpringBoot之RabbitMQ的使用方法

    這篇文章主要介紹了SpringBoot之RabbitMQ的使用方法,詳細(xì)的介紹了2種模式,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-12-12
  • Java中ThreadLocal使用原理及Synchronized區(qū)別

    Java中ThreadLocal使用原理及Synchronized區(qū)別

    ThreadLocal叫做線程變量,本文詳細(xì)的介紹了ThreadLocal使用原理及Synchronized區(qū)別,有需要的朋友可以參考一下,希望對(duì)你有所幫助。
    2023-05-05
  • Java采用setAsciiStream方法檢索數(shù)據(jù)庫(kù)指定內(nèi)容實(shí)例解析

    Java采用setAsciiStream方法檢索數(shù)據(jù)庫(kù)指定內(nèi)容實(shí)例解析

    這篇文章主要介紹了Java采用setAsciiStream方法檢索數(shù)據(jù)庫(kù)指定內(nèi)容,是比較實(shí)用的功能,需要的朋友可以參考下
    2014-08-08
  • java 線程同步詳細(xì)介紹及實(shí)例代碼

    java 線程同步詳細(xì)介紹及實(shí)例代碼

    這篇文章主要介紹了java 線程同步詳細(xì)介紹及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • SpringBoot 集成MQTT實(shí)現(xiàn)消息訂閱的詳細(xì)代碼

    SpringBoot 集成MQTT實(shí)現(xiàn)消息訂閱的詳細(xì)代碼

    本文介紹了如何在SpringBoot中集成MQTT并實(shí)現(xiàn)消息訂閱,主要步驟包括添加依賴、配置文件設(shè)置、啟動(dòng)類注解、MQTT配置類、消息處理器配置、主題緩存、動(dòng)態(tài)數(shù)據(jù)庫(kù)主題配置以及消息處理服務(wù),感興趣的朋友跟隨小編一起看看吧
    2024-11-11
  • Java處理日期時(shí)間的方法匯總

    Java處理日期時(shí)間的方法匯總

    這篇文章主要給大家介紹了利用Java中的Calendar 類處理日期時(shí)間的方法匯總,其中包括取日期的每部分、取當(dāng)月的第一天或最后一天、求兩個(gè)日期之間相隔的天數(shù)以及一年前的日期等等的示例代碼,有需要的朋友們可以直接參考借鑒,下面來(lái)一起看看吧。
    2016-12-12

最新評(píng)論

英德市| 依安县| 汾阳市| 金乡县| 牡丹江市| 武平县| 海伦市| 南昌县| 岐山县| 靖安县| 叙永县| 水城县| 阿鲁科尔沁旗| 密云县| 颍上县| 贵南县| 亚东县| 尉犁县| 渝中区| 盖州市| 武川县| 怀安县| 合山市| 宝丰县| 昌乐县| 兰坪| 内丘县| 宁乡县| 定日县| 会东县| 威宁| 琼中| 桐梓县| 扎鲁特旗| 涿州市| 合阳县| 萨迦县| 洛阳市| 嵊泗县| 乡宁县| 沾益县|