定义:动态地将责任附加到对象上。想要扩展新功能,装饰者提供有别于继承的另一种选择。
简略图:
从图中可以看出,装饰者和被装饰者有着相同的超类。
// 顶层 抽象类 饮料
public abstract class Beverage {
// 描述
String description = "Unknown Beverage";
public String getDescription() {
return description;
}
// 花费
public abstract double cost();
}
// 调料 继承自饮料
// 所有装饰者(调料)需要继承的抽象类
public abstract class Condiment extends Beverage {
// 每个调料都需要实现的方法
@Override
public abstract String getDescription();
}
// 调料摩卡 一个装饰者实例
public class Mocha extends Condiment {
Beverage beverage; // 持有被装饰者的引用
public Mocha(Beverage beverage) { // 通过构造传递参数
this.beverage = beverage;
}
//在原组件的基础上添加新的装饰
@Override
public String getDescription() {
return beverage.getDescription() + ", Mocha ";
}
@Override
public double cost() {
return .20 + beverage.cost();
}
}
在JDK中的应用: