案例:咖啡店想建立生成订单的程序。订单要有咖啡的种类、加的调料种类以及它们的价格。以后可能出现新的调料,有的咖啡不能添加某种调料。
学到的新的原则:对扩展开放,对修改关闭。(本例中用低藕的组合代替了高藕的继承。是对于扩展功能,有别于继承的另一种选择)
装饰者模式:动态的将责任添加到对象上。想要扩展功能,装饰者提供有别于继承的另一种选择。
解决方案:咖啡作为 被装饰者,调料作为装饰者。装饰者将 被装饰者或者 装饰过的被装饰者包(装饰)起来,利用这种组合的方式,为被装饰者提供新功能,避免继承。有多重嵌套的意味。而且也因此,装饰者与被装饰者继承于同一个超类,这样装饰者才能装饰 被装饰过的被装饰者。
public abstract class Beverage {//装饰者和被装饰者共同继承的父类
String description;
public String getDescription(){
return description;
}
public abstract double cost();
}
public abstract class DecoratorCondiment extends Beverage {//装饰者的父类
Beverage beverage;
public abstract String getDescription();
@Override
public double cost() {
return 0;
}
}
public class Mocha extends DecoratorCondiment {
public Mocha(Beverage beverage){//呈现组合关系。传入被装饰者,为其添加新功能
this.beverage = beverage;
description = "Mocha";
}
public double cost(){
return beverage.cost() + .20;
}
@Override
public String getDescription() {
return description + beverage.getDescription();
}
}
public class Esprreso extends Beverage {//被装饰者
public Esprreso(){
description = "Esprreso";
}
@Override
public double cost() {
return 1.99;
}
}