Demo场景:对不同类型的coffee进行计价。
被装饰对象可以被多个装饰者装饰;理解java.io.*中类之间的关系。
(1)装饰者与被装饰者共同抽象基类:Beverage
package designpattern.decorator.coffee;
/**
* 装饰者和装饰对象共同的基类
*/
public abstract class Beverage {
String description = "Unknow Beverage";
public String getDescription(){
return description;
}
public abstract double cost();
}
(2)被装饰对象:Espresso
package designpattern.decorator.coffee;
public class Espresso extends Beverage {
public Espresso(){
description = "Espresso";
}
@Override
public double cost() {
return 1.99;
}
}
(3)装饰者抽象类:CondimentDecorator
package designpattern.decorator.coffee;
/**
* 需要让装饰者类能够取代基类(Beverage),所以要集成基类
*/
public abstract class CondimentDecorator extends Beverage {
public abstract String getDescription();
}
(4)装饰者继承类:Mocha
package designpattern.decorator.coffee;
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 beverage.cost() + 0.2;
}
}
装饰者模型演示:
package designpattern.decorator.coffee;
public class StarbuzzCoffee {
public static void main(String[] args) {
Beverage beverage = new Espresso();
//不加装饰者类,直接输出
System.out.println(beverage.getDescription() + " $" + beverage.cost());
//添加装饰者类,再输出
beverage = new Mocha(beverage);
System.out.println(beverage.getDescription() + " $" + beverage.cost());
}
}