溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Java設(shè)計(jì)模式解析之適配器模式怎么實(shí)現(xiàn)

發(fā)布時(shí)間:2022-04-28 10:17:24 來源:億速云 閱讀:109 作者:iii 欄目:編程語言

本篇內(nèi)容介紹了“Java設(shè)計(jì)模式解析之適配器模式怎么實(shí)現(xiàn)”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

Java設(shè)計(jì)模式解析之適配器模式怎么實(shí)現(xiàn)


一、什么是適配器模式:

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

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

  • (1)系統(tǒng)需要使用現(xiàn)有的類,而這些類的接口不符合系統(tǒng)的接口。

  • (2)使用第三方組件,組件接口定義和自己定義的不同,不希望修改自己的接口,但是要使用第三方組件接口的功能。

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

Java設(shè)計(jì)模式解析之適配器模式怎么實(shí)現(xiàn)

Java設(shè)計(jì)模式解析之適配器模式怎么實(shí)現(xiàn)

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

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

1、類的適配器模式:

Java設(shè)計(jì)模式解析之適配器模式怎么實(shí)現(xiàn)

  • 目標(biāo)接口(Target):客戶所期待的接口。目標(biāo)可以是具體的或抽象的類,也可以是接口。

  • 需要適配的類(Adaptee):需要適配的類或適配者類。

  • 適配器(Adapter):通過包裝一個(gè)需要適配的對(duì)象,把原接口轉(zhuǎn)換成目標(biāo)接口。

// 已存在的、具有特殊功能、但不符合我們既有的標(biāo)準(zhǔn)接口的類
class Adaptee {
	public void specificRequest() {
		System.out.println("被適配類具有 特殊功能...");
	}
}
 
// 目標(biāo)接口,或稱為標(biāo)準(zhǔn)接口
interface Target {
	public void request();
}
 
// 具體目標(biāo)類,只提供普通功能
class ConcreteTarget implements Target {
	public void request() {
		System.out.println("普通類 具有 普通功能...");
	}
}
 
// 適配器類,繼承了被適配類,同時(shí)實(shí)現(xiàn)標(biāo)準(zhǔn)接口
class Adapter extends Adaptee implements Target{
	public void request() {
		super.specificRequest();
	}
}
 
// 測(cè)試類public class Client {
	public static void main(String[] args) {
		// 使用普通功能類
		Target concreteTarget = new ConcreteTarget();
		concreteTarget.request();
		
		// 使用特殊功能類,即適配類
		Target adapter = new Adapter();
		adapter.request();
	}
}

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

普通類 具有 普通功能...
被適配類具有 特殊功能...

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

Java設(shè)計(jì)模式解析之適配器模式怎么實(shí)現(xiàn)

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

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

3、接口的適配器模式:

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

Java設(shè)計(jì)模式解析之適配器模式怎么實(shí)現(xiàn)

這個(gè)很好理解,在實(shí)際開發(fā)中,我們也常會(huì)遇到這種接口中定義了太多的方法,以致于有時(shí)我們?cè)谝恍?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 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!

“Java設(shè)計(jì)模式解析之適配器模式怎么實(shí)現(xiàn)”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI