装饰者模式
在不修改任何底层代码的情况下,给你的(或别人的)对象赋予新的职责。
设计原则:
- 类应该对扩展开放,对修改关闭。
实体类
/**
* 饮料
*
* @author NNroc
* @date 2020/8/4 11:36
*/
public abstract class Beverage {
protected String description = "Unknown Beverage";
public String getDescription() {
return description;
}
public abstract double cost();
}
/**
* 调料
* CondimentDecorator 取代 Beverage
*
* @author NNroc
* @date 2020/8/4 11:48
*/
public abstract class CondimentDecorator extends Beverage {
public abstract String getDescription();
}
实现类(咖啡种类 Beverage)
/**
* 深焙
*
* @author NNroc
* @date 2020/8/4 12:00
*/
public class DarkRoast extends Beverage {
public DarkRoast() {
description = "Dark Roast Coffee";
}
public double cost() {
return .99;
}
}
/**
* 低咖啡因
*
* @author NNroc
* @date 2020/8/4 12:02
*/
public class Decat extends Beverage {
public Decat() {
description = "Decat Coffee";
}
public double cost() {
return 1.05;
}
}
/**
* 浓缩咖啡
*
* @author NNroc
* @date 2020/8/4 11:51
*/
public class Espresso extends Beverage {
public Espresso() {
description = "Espresso";
}
public double cost() {
return 1.99;
}
}
/**
* 综合
*
* @author NNroc
* @date 2020/8/4 11:53
*/
public class HouseBlend extends Beverage {
public HouseBlend() {
description = "House Blend Coffee";
}
public double cost() {
return .89;
}
}
实现类(配料 CondimentDecorator)
/**
* 摩卡
*
* @author NNroc
* @date 2020/8/4 11:55
*/
public class Mocha extends CondimentDecorator {
Beverage beverage;
public Mocha(Beverage beverage) {
this.beverage = beverage;
}
public String getDescription() {
return beverage.getDescription() + ", Mocha";
}
public double cost() {
return .20 + beverage.cost();
}
}
/**
* 豆浆
*
* @author NNroc
* @date 2020/8/4 12:03
*/
public class Soy extends CondimentDecorator {
Beverage beverage;
public Soy(Beverage beverage) {
this.beverage = beverage;
}
public String getDescription() {
return beverage.getDescription() + ", Soy";
}
public double cost() {
return .15 + beverage.cost();
}
}
/**
* 奶油
*
* @author NNroc
* @date 2020/8/4 12:04
*/
public class Whip extends CondimentDecorator {
Beverage beverage;
public Whip(Beverage beverage) {
this.beverage = beverage;
}
public String getDescription() {
return beverage.getDescription() + ", Whip";
}
public double cost() {
return .10 + beverage.cost();
}
}
测试
/**
* @author NNroc
* @date 2020/8/4 11:58
*/
public class StarbuzzCoffee {
public static void main(String[] args) {
// 不加配料的 Espresso
Beverage beverage = new Espresso();
System.out.println(beverage.getDescription() + " $" + beverage.cost());
// 加3个配料的 DarkRoast
Beverage beverage2 = new DarkRoast();
beverage2 = new Mocha(beverage2);
beverage2 = new Mocha(beverage2);
beverage2 = new Whip(beverage2);
System.out.println(beverage2.getDescription() + " $" + beverage2.cost());
// 加3个不同配料的 HouseBlend
Beverage beverage3 = new HouseBlend();
beverage3 = new Soy(beverage3);
beverage3 = new Mocha(beverage3);
beverage3 = new Whip(beverage3);
System.out.println(beverage3.getDescription() + " $" + beverage3.cost());
}
}