1. 程式人生 > >Java中的裝飾者模式

Java中的裝飾者模式

裝飾者模式動態地將責任附加到物件上。若要擴充套件功能,裝飾者提供了比繼承更有彈性的替代方案

接下來舉一個例子來說明,這個例子是Head Frist 設計模式中的一個例子

場景:在星巴克的咖啡銷售系統中,提供咖啡和調料的組合,並且在使用者選好了咖啡和調料之後自動計算價格

某客戶點了 濃縮咖啡加摩卡加牛奶的組合

首先是飲料類的抽象類

package com.zw.mymaven;

//飲料的抽象類
public abstract class Beverage {
	String description = "Unknown Beverage";
	//描述 
	public String getdescribtion() {
		return description;
	}
	//花 費
	public abstract double cost();
}
調料類的抽象類
package com.zw.mymaven;

//調料類,也是裝飾者類
public abstract class CondimentDecorrator {
	//這裡要重寫getDescribtion的原因
	//所謂裝飾者類 其實就是包含被裝飾者的類
	//那麼被裝飾者和裝飾者中的共有的還沒定義的方法在這裡定義
	public abstract String getDescribtion();
}

濃縮咖啡類
package com.zw.mymaven;

//濃縮咖啡的飲料類的實現
public class Espresso extends Beverage {
	public Espresso() {
		description = "這是一杯濃縮咖啡";
	}
	@Override
	public double cost() {
		return 1;
	}
}
摩卡類
package com.zw.mymaven;

public class Moka extends CondimentDecorrator {
	Beverage beverage;

	public Moka(Beverage beverage) {
		this.beverage = beverage;
	}

	@Override
	public String getDescribtion() {
		return beverage.getdescribtion() + "加了摩卡,";
	}

	public double cost() {
		return beverage.cost() + 2;
	}
}

牛奶類
package com.zw.mymaven;

public class Milk extends CondimentDecorrator {
	Beverage beverage;
	public Milk(Beverage beverage) {
		this.beverage = beverage;
	}
	@Override
	public String getDescribtion() {
		return beverage.getdescribtion() + "加了牛奶,";
	}
	public double cost() {
		return beverage.cost() + 3;
	}
}
測試類
package com.zw.mymaven;

public class Test3 {

	public static void main(String[] args) {
		// 點一杯濃縮咖啡
		Beverage espresso = new Espresso();
		// 加入摩卡
		espresso = new Moka(espresso);
		// 加入牛奶
		espresso = new Milk(espresso);
		System.out.println(espresso.getdescribtion() + "花費了" + espresso.cost());
	}

}