Java裝飾者模式是什么意思

這篇文章主要講解了“Java裝飾者模式是什么意思”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“Java裝飾者模式是什么意思”吧!

創(chuàng)新互聯(lián)公司專注于昆明企業(yè)網(wǎng)站建設(shè),成都響應(yīng)式網(wǎng)站建設(shè),商城系統(tǒng)網(wǎng)站開(kāi)發(fā)。昆明網(wǎng)站建設(shè)公司,為昆明等地區(qū)提供建站服務(wù)。全流程按需搭建網(wǎng)站,專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,創(chuàng)新互聯(lián)公司專業(yè)和態(tài)度為您提供的服務(wù)

一、定義

裝飾模式的設(shè)計(jì)理念主要是以對(duì)客戶端透明的方式動(dòng)態(tài)擴(kuò)展對(duì)象的功能,是繼承關(guān)系的一個(gè)替代(繼承會(huì)產(chǎn)生大量的子類,而且代碼有冗余)。裝飾模式可以在不創(chuàng)造更多子類的情況下,將對(duì)象的功能加以擴(kuò)展。裝飾模式把客戶端的調(diào)用委派到被裝飾類。裝飾模式的關(guān)鍵在于這種擴(kuò)展完全是透明的(裝飾模式的透明性要求客戶端程序不應(yīng)該將對(duì)象聲明為具體構(gòu)件類型或具體裝飾類型,而應(yīng)該全部聲明為抽象構(gòu)件類型),裝飾模式的應(yīng)用在java的I/O流中最為顯著。

二、角色
  • 抽象構(gòu)件角色(Component):通常是一個(gè)抽象類或者一個(gè)接口,定義了一系列方法,方法的實(shí)現(xiàn)可以由子類實(shí)現(xiàn)或者自己實(shí)現(xiàn)。通常不會(huì)直接使用該類,而是通過(guò)繼承該類或者實(shí)現(xiàn)該接口來(lái)實(shí)現(xiàn)特定的功能。(例如,對(duì)于動(dòng)物類,有一個(gè)抽象方法輸出所有的功能,基本功能包括:呼吸,覓食,睡覺(jué)等等)

  • 具體構(gòu)件角色(Concrete Component):是Component的子類,實(shí)現(xiàn)了對(duì)應(yīng)的方法,它就是那個(gè)被裝飾的類。(具體構(gòu)建角色可以建立很多個(gè),例如狗,貓,鳥(niǎo)等等,如果是狗,我們可以裝飾一些吼叫的功能,吃肉的功能;鳥(niǎo)可以裝飾一些飛行的功能,帶有翅膀的功能等等。當(dāng)然這些需要在具體裝飾角色中去具體定義)

  • 裝飾角色(Decorator):是Component的子類,它是具體裝飾角色共同實(shí)現(xiàn)的抽象類(也可以是接口),并且持有一個(gè)Component類型的對(duì)象引用,它的主要作用就是把客戶端的調(diào)用委派到被裝飾類。

  • 具體裝飾角色(Concrete Decorator):它是具體的裝飾類,是Decorator的子類,當(dāng)然也是Component的子類。它主要就是定義具體的裝飾功能,例如上面說(shuō)的,對(duì)于鳥(niǎo)這個(gè)具體構(gòu)建角色而言,除了具備抽象構(gòu)件角色基本的功能,它還具有一些飛行的功能,帶翅膀的功能。那么我們可以把這兩個(gè)功能定義成一個(gè)具體裝飾角色1,對(duì)于狗這個(gè)具體構(gòu)件角色而言,我們可以把吼叫,吃肉這兩個(gè)功能定義成一個(gè)具體裝飾角色2,這樣,如果我們?cè)俣x一個(gè)狼這樣的具體構(gòu)件角色的時(shí)候,就可以直接用具體裝飾角色2來(lái)進(jìn)行裝飾。Java裝飾者模式是什么意思

三、Example

以上面所說(shuō)的動(dòng)物的例子來(lái)寫(xiě)代碼演示。

抽象構(gòu)件角色(對(duì)應(yīng)動(dòng)物類)

public interface Component {
	void function();
}

具體構(gòu)件角色(對(duì)應(yīng)狗)

public class ConcreteComponent implements Component {

	@Override
	public void function() {
		System.out.println("基本功能:呼吸+覓食+睡覺(jué)");
	}

}

裝飾角色

public class Decorator implements Component {

	private Component component; //持有一個(gè)Component類型的對(duì)象引用
	
	public Decorator(Component component) {
		this.component = component;
	}
	 
	@Override
	public void function() {
		component.function(); //客戶端的調(diào)用委派給具體的子類
	}

}

具體裝飾角色(對(duì)應(yīng)吼叫和吃肉這兩個(gè)功能)

public class ConcreteDecorator extends Decorator {

	public ConcreteDecorator(Component component) {
		super(component);
	}
	 
	@Override
	public void function() {
		super.function();
		System.out.println("附加功能:");
		this.eat();
		this.bellow();
		
	}
	
	private void eat() {
		System.out.println("吃肉");
	}
	
	private void bellow() {
		System.out.println("吼叫");
	}
}

客戶端測(cè)試:

public class ClientTest {
	public static void main(String[] args) {
		Component component = new ConcreteComponent(); 
		System.out.println("------裝飾前:-------");
		component.function();
		Component newComponent = new ConcreteDecorator(component);
		System.out.println("------裝飾后:-------");
		newComponent.function();
	}
}

輸出:
------裝飾前:-------
基本功能:呼吸+覓食+睡覺(jué)
------裝飾后:-------
基本功能:呼吸+覓食+睡覺(jué)
附加功能:吃肉+吼叫
四、應(yīng)用

裝飾者模式主要應(yīng)用在Java的I/O流中,如果讀者對(duì)I/O流體系比較混亂的話,不妨利用裝飾者模式去理理思路。OutputStream和InputStream就對(duì)應(yīng)于抽象構(gòu)件角色(Component),F(xiàn)ileInputStream和FileOutputStream就對(duì)應(yīng)具體構(gòu)件角色(ConcreteComponent),F(xiàn)ilterOutputStream和FilterInputStream就對(duì)應(yīng)著裝飾角色(Decorator),而B(niǎo)ufferedOutputStream,DataOutputStream等等就對(duì)應(yīng)著具體裝飾角色。

感謝各位的閱讀,以上就是“Java裝飾者模式是什么意思”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)Java裝飾者模式是什么意思這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

標(biāo)題名稱:Java裝飾者模式是什么意思
標(biāo)題鏈接:http://bm7419.com/article22/jdghcc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站營(yíng)銷(xiāo)、ChatGPT動(dòng)態(tài)網(wǎng)站、手機(jī)網(wǎng)站建設(shè)、企業(yè)網(wǎng)站制作、

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

小程序開(kāi)發(fā)