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());
	}

}


你可能感兴趣的:(设计模式GOF)