小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

設(shè)計(jì)模式之裝飾者模式(二)

 行者花雕 2020-07-11

寫下代碼

動(dòng)手的時(shí)候來啦,我們先從Beverage類下手。這不需要修改原有的設(shè)計(jì),如下所示:

/**
 * 
 * @Description: Beverage是一個(gè)抽象類,有兩個(gè)方法:getDescription()以及cost()
 * @author:XuYue
 */
public abstract class Beverage {
	String description = "Unknown Beverage";
	
	// getDescription()已經(jīng)在此實(shí)現(xiàn)了,但是cost()必須在子類中實(shí)現(xiàn)
	public String getDescription() {
		return description;
	}
	
	public abstract double cost();
}

然后我們繼續(xù)實(shí)現(xiàn)Condiment(調(diào)料)抽象類,也就是裝飾者類:

/**
 * 
 * @Description: 必須讓CondimentDecorator能夠取代Beverage,所以將CondimentDecorator擴(kuò)展自Beverage類
 */
public abstract class CondimentDecorator extends Beverage {
	// 所有的調(diào)料裝飾者都必須重新實(shí)現(xiàn)getDescription()方法,稍后說明原因
	public abstract String getDescription();
}

寫飲料的代碼

有了上面的基礎(chǔ),即已經(jīng)有了基類,那我們就可以愉快的把飲料類實(shí)現(xiàn)了。先從濃縮咖啡(Espresso)開始吧。在這,我們需要實(shí)現(xiàn)cost()方法以及將描述設(shè)置清楚。其他類,在代碼里表現(xiàn),就不在文中體現(xiàn)啦。

/**
 * 
 * @Description:首先,讓Espresso擴(kuò)展自Beverage類,因?yàn)镋spresso是一種飲料
 * @author:XuYue
 */
public class Espresso extends Beverage {

	public Espresso() {
		// 為了要設(shè)置飲料的描述,我們寫了一個(gè)構(gòu)造器,description繼承自Beverage
		description = "Espresso";
	}
	
	// 需要計(jì)算Espresso的價(jià)錢
	@Override
	public double cost() {
		return 1.99;
	}

}

寫調(diào)料代碼

還記得上篇中的類圖嗎,根據(jù)類圖我們已經(jīng)完成了抽象組件(Beverage),有了具體組件(HoustBlend),也有了抽象裝飾者(CondimentDecorator)。那么,就差實(shí)現(xiàn)具體的裝飾者了,也就是我們的調(diào)料。這里是列舉Mocha,其他的自行實(shí)現(xiàn)哦。小編提供的代碼里已經(jīng)實(shí)現(xiàn)啦, 感興趣的小伙伴,可以寫完和小編的PK下。

/**
 * 
 * @Description:
 * 摩卡是一個(gè)裝飾者,所以讓它擴(kuò)展自CondimentDecorator
 * CondimentDecorator擴(kuò)展自Beverage
 * @author:XuYue
 */
public class Mocha extends CondimentDecorator {

	Beverage beverage;
	
	public Mocha(Beverage beverage) {
		this.beverage = beverage;
	}
	
	@Override
	public String getDescription() {
		return beverage.getDescription() + " , Mocha";
	}

	@Override
	public double cost() {
		return 0.20 + beverage.cost();
	}

}

供應(yīng)咖啡

恭喜你,經(jīng)歷過之前的準(zhǔn)備,是時(shí)候坐下來休息休息,點(diǎn)一杯咖啡享受下人生啦。來看看你的裝飾者模式設(shè)計(jì)出來的系統(tǒng)吧。

寫之前,我們先看看雙倍摩卡咖啡的是怎么裝飾的吧。其實(shí)就是上一篇中的單倍摩卡,再加一層摩卡的裝飾類即可,是不是很神奇呢。

public class StarbuzzCoffee {

	public static void main(String[] args) {
		// 訂一杯Espresso,不需要調(diào)料
		Beverage beverage = new Espresso();
		System.out.println(beverage.getDescription() + " $" + beverage.cost());
		
		// 訂一杯雙倍Mocha加Whip的DarkRoast()咖啡
		Beverage beverage2 = new DarkRoast();
		// 用Mocha裝飾它
		beverage2 = new Mocha(beverage2);
		// 用第二個(gè)Mocha裝飾它
		beverage2 = new Mocha(beverage2);
		// 用Whip裝飾它
		beverage2 = new Whip(beverage2);
		System.out.println(beverage2.getDescription() + " $" + beverage2.cost());
		
		// 訂一杯調(diào)料為Soy、Mocha、Whip的HouseBlend咖啡
		Beverage beverage3 = new HouseBlend();
		beverage3 = new Soy(beverage3);
		beverage3 = new Mocha(beverage3);
		beverage3 = new Whip(beverage3);
		System.out.println(beverage3.getDescription() + " $" + beverage3.cost());
		
	}
}

// 輸出結(jié)果
Espresso $1.99
Dark Roast Coffee , Mocha , Mocha , Whip $1.49
House Blend Coffee , Soy , Mocha , Whip $1.34

目前為止,我們已經(jīng)把上篇遺留下來的類圖轉(zhuǎn)換成了代碼實(shí)現(xiàn)出來。當(dāng)我們?cè)诤竺娼榻B到工廠和生成器模式的時(shí)候,將會(huì)有更好的方式建立被裝飾者對(duì)象。所以,盡管現(xiàn)在的裝飾者模式存在部分缺陷,但不妨礙我們對(duì)這個(gè)模式的學(xué)習(xí),后續(xù)的增加,只是對(duì)模式有更加深刻的認(rèn)知。

所以,這次的內(nèi)容就先到這里。下一篇,我們針對(duì)性的對(duì)現(xiàn)有JDK中的裝飾者模式舉個(gè)例子,并對(duì)裝飾者模式做出總結(jié)。

留個(gè)小習(xí)題,在這次講的過程中我們是加了調(diào)料, 那咖啡廳里現(xiàn)在都會(huì)有杯子的大小,小杯、中杯、大杯,并收取相應(yīng)的價(jià)錢,該如何編寫呢?先拋個(gè)磚,我們?cè)贐everage類中加上getSize()和setSize()。下次小編會(huì)給出答案噢。

PS:代碼已經(jīng)上傳,需要查看的朋友點(diǎn)擊此處HeadFirstDesign

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多