定义
装饰者模式,动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。
package day01.designPattern.decorate;
/**
* @author ZerlindaLi create at 2019/8/8 17:21
* @version 1.0.0
* @description 抽象组件 Beverage
*/
public abstract class Beverage {
String description = "Unknown Beverage";
public String getDescription() {
return description;
}
public abstract double cost();
}
package day01.designPattern.decorate;
/**
* @author ZerlindaLi create at 2019/8/8 17:23
* @version 1.0.0
* @description 抽象装饰者 调料装饰者CondimentDecorator
*/
public abstract class CondimentDecorator extends Beverage {
public abstract String getDescription();
}
package day01.designPattern.decorate;
/**
* @author ZerlindaLi create at 2019/8/9 17:25
* @version 1.0.0
* @description 具体组件 奶茶 MilkTea 是一种饮料,所以让MilkTea扩展Beverage类
*/
public class MilkTea extends Beverage {
public MilkTea () {
description = "奶茶";
}
@Override
public double cost() {
return 1.98;
}
}
package day01.designPattern.decorate;
/**
* @author ZerlindaLi create at 2019/8/9 17:36
* @version 1.0.0
* @description Coco 椰汁 是一个装饰者,所以让它扩展自CondimentDecorator
*/
public class Coco extends CondimentDecorator {
Beverage beverage;
public Coco (Beverage beverage) {
this.beverage = beverage;
}
@Override
public String getDescription() {
return beverage.getDescription() + ", 椰果";
}
@Override
public double cost() {
return 0.8 + beverage.cost();
}
}
package day01.designPattern.decorate;
/**
* @author ZerlindaLi create at 2019/8/9 17:33
* @version 1.0.0
* @description Pearl 珍珠 是一个装饰者,所以让它扩展自CondimentDecorator
*/
public class Pearl extends CondimentDecorator {
Beverage beverage;
public Pearl(Beverage beverage){
this.beverage = beverage;
}
@Override
public String getDescription() {
return beverage.getDescription() + ", 珍珠";
}
@Override
public double cost() {
return .05 + beverage.cost();
}
}
package day01.designPattern.decorate;
/**
* @author ZerlindaLi create at 2019/8/9 17:38
* @version 1.0.0
* @description PearlMilkTea
*/
public class PearlMilkTea {
public static void main(String[] args) {
// 创建一个奶茶
Beverage beverage = new MilkTea();
// 给奶茶加上珍珠
beverage = new Pearl(beverage);
// 给奶茶加上椰果
beverage = new Coco(beverage);
System.out.println(beverage.getDescription() + " $"+beverage.cost());
}
}
输出
奶茶, 珍珠, 椰果 $2.83