欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

定義

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

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

結(jié)構(gòu)

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

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

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

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

在這里插入圖片描述

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

在這里插入圖片描述

示例

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

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

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)){
			//實現(xiàn)播放音樂功能
			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)){
			//實現(xiàn)播放音樂功能
			System.out.println("playing music with lightning Player..." + musicName);
		}else {
			System.out.println("error!");
		}
	}
}

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

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

public class Transverter extends TypecPlayMusicConn implements ThreePointFiveConn {
	//調(diào)用繼承的適配者類的方法
	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");
	}
}

運行結(jié)果:

playing music with typec Player…Hey Jude

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

3、構(gòu)建適配器類,將適配者類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");
	}
}

運行結(jié)果:

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

擴展

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

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

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)點是將目標類和適配者類解耦,增加了類的透明性和復用性,同時系統(tǒng)的靈活性和擴展性都非常好,更換適配器或者增加新的適配器都非常方便,符合“開閉原則”。

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

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

相關文章

  • 使用SpringBoot Actuator監(jiān)控應用示例

    使用SpringBoot Actuator監(jiān)控應用示例

    Actuator是Spring Boot提供的對應用系統(tǒng)的自省和監(jiān)控的集成功能,可以對應用系統(tǒng)進行配置查看、相關功能統(tǒng)計等。這篇文章主要介紹了使用SpringBoot Actuator監(jiān)控應,有興趣的可以了解一下
    2018-05-05
  • Java中Spring Boot+Socket實現(xiàn)與html頁面的長連接實例詳解

    Java中Spring Boot+Socket實現(xiàn)與html頁面的長連接實例詳解

    這篇文章主要介紹了Java中Spring Boot+Socket實現(xiàn)與html頁面的長連接實例詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-07-07
  • 詳解springboot中junit回滾

    詳解springboot中junit回滾

    本篇文章主要介紹了springboot中junit回滾,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • Map集合中獲取key-value值的實現(xiàn)方法

    Map集合中獲取key-value值的實現(xiàn)方法

    這篇文章主要介紹了Map集合中獲取key-value值的實現(xiàn)方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • Java中DecimalFormat用法詳解

    Java中DecimalFormat用法詳解

    這篇文章主要為大家詳細介紹了Java中DecimalFormat的用法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • javaweb在線支付功能實現(xiàn)代碼

    javaweb在線支付功能實現(xiàn)代碼

    這篇文章主要為大家詳細介紹了javaweb在線支付功能的實現(xiàn)代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • 基于hibernate框架在eclipse下的配置方法(必看篇)

    基于hibernate框架在eclipse下的配置方法(必看篇)

    下面小編就為大家?guī)硪黄趆ibernate框架在eclipse下的配置方法(必看篇)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • Spring?注入靜態(tài)對象使用三種方式示例

    Spring?注入靜態(tài)對象使用三種方式示例

    這篇文章主要為大家介紹了Spring注入靜態(tài)對象使用的三種方式示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07
  • Spring?boot?Jpa添加對象字段使用數(shù)據(jù)庫默認值操作

    Spring?boot?Jpa添加對象字段使用數(shù)據(jù)庫默認值操作

    這篇文章主要介紹了Spring?boot?Jpa添加對象字段使用數(shù)據(jù)庫默認值操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Java中使用Jedis操作Redis的實現(xiàn)代碼

    Java中使用Jedis操作Redis的實現(xiàn)代碼

    本篇文章主要介紹了Java中使用Jedis操作Redis的實現(xiàn)代碼。詳細的介紹了Redis的安裝和在java中的操作,具有一定的參考價值,有興趣的可以了解一下
    2017-05-05

最新評論