Java 装饰者模式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hoho_12/article/details/82390335

装饰者模式

课题:星巴兹咖啡

beverage:饮料

condiment: 调料

开发-关闭原则:类应该对扩展开放,对修改关闭。

定义装饰者模式

装饰者模式:动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。

//饮料抽象类
public abstract class Beverage {
	String description = "Unknown Beverage";	
	public String getDescription(){
		return description;
	}	
	public abstract double cost();	
}

//调料抽象类
public abstract class CondimentDecorator extends Beverage{
	public abstract String getDescription();
}

//具体的饮料类 浓缩咖啡
public class Espresso extends Beverage{
	public Espresso() {
		description = "Espresso";
	}	
	@Override
	public double cost() {
		return 1.99;
	}
}

//具体饮料类
public class HouseBlend extends Beverage{
	public HouseBlend() {
		description = "House Blend Coffee";
	}	
	@Override
	public double cost() {		
		return 0.89;
	}
}

具体调料装饰类
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();
	}
}

public class Whip extends CondimentDecorator{
	Beverage beverage;	
	public Whip(Beverage beverage) {
		this.beverage = beverage;
	}	
	@Override
	public String getDescription() {
		return beverage.getDescription() + " , Whip";
	}
	@Override
	public double cost() {
		return 0.5 + beverage.cost();
	}
}

测试类
public class StarbuzzCoffee {
	public static void main(String[] args) {
		//不需要调料
		Beverage beverage = new Espresso();
		System.out.println(beverage.getDescription()
				+ " $" + beverage.cost());
		
		Beverage beverage2 = new HouseBlend();
		beverage2 = new Mocha(beverage2);
		beverage2 = new Whip(beverage2);
		System.out.println(beverage2.getDescription()
				+" $" + beverage2.cost());
	}	
}

猜你喜欢

转载自blog.csdn.net/hoho_12/article/details/82390335
今日推荐