为了说明这个模式,这里使用咖啡销售为例。
首先看一下如下的关系图:
由上图可以看出:对于每种咖啡的加料,我们都继承自CondimentDecorator
这个抽象类,而这个抽象类又继承了Baverage
这个抽象类。
在配料类中,我们可以看到有个beverage
的引用!
这个引用的作用:不断
new
配料时,将之前的配方传入作为类变量的引用。这样我们在计算cost()
时就可以通过多态来求得成品咖啡的价格!
下面看一下Espresso
的代码
public class Espresso extends Beverage {
public Espresso(){
description = "Espresso";
}
@Override
public double cost() {
return 1.99;
}
}
配料Mocha
的代码:
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.2 + beverage.cost();
}
}
总台收银代码:
public class StarbuzzCoffee {
public static void main(String[] args) {
Beverage beverage = new Espresso();
beverage = new Mocha(beverage);
beverage = new Mocha(beverage);
beverage = new Soy(beverage);
System.out.println(beverage.getDescription() + " $"+beverage.cost());
}
}
/*
Output:
Espresso, Mocha, Mocha, Soy $2.73
*/