定义
动态地将责任附加到对象上。若要扩展功能,装饰者提供比继承更有弹性的替代方案。
类图
代码实现
书中星巴兹饮料的例子
Beverage类(component抽象类)
//抽象饮料类
public abstract class Beverage {
String description = "Unknow Beverage";
public String getDescription() {
return description;
}
public abstract double cost();
}
Condiment类(装饰者接口)
//调料抽象类
public abstract class CondimentDecorator extends Beverage {
public abstract String getDescription();
}
具体的饮料类
//饮料类
public class Espresso extends Beverage {
public Espresso() {
description = "Espresso";
}
public double cost() {
return 1.99;
}
}
具体的调料类
//具体调料类
public Mocha extends CondimentDecorator {
Beverage beverage;
public Mocha(Beverage beverage;) {
this.beverage = beverage;
}
public String getDescription() {
return beverage.getDescription() + ",Mocha";
}
public double cost() {
return 0.20 + beverage.cost();
}
}
总结
装饰者类通过不停包裹组件,有弹性的扩展功能。通过学习这个设计模式,了解了,开闭原则(对扩展开发,对修改关闭)。