在关于装饰器模式的章节中的“头部设计模式(2014年,第2版)”一书中,作者从4种调味品类(牛奶,摩卡,大豆,鞭子)中采用实例变量饮料饮料并将其放入摘要中class CondimentDecorator. (参见第110页
public abstract class CondimentDecorator extends Beverage{ public Beverage beverage; public abstract String getDescription(); public Size getSize(){ return beverage.getSize(); } }
将实例变量饮料饮料从调味品类移动到抽象类CondimentDecorator的原因是什么?
他们这样做是为了保存一些代码行吗,因为现在调味品不需要声明自己的实例变量,因为它们从抽象类继承它?
咖啡店的UML图在移动实例变量之前:
更重要的是,与减少代码大小相比,将Beverage实例移动到CondimentDecorator中可确保每个CondimentDecorator实际上都有Beverage.否则,有人可以在没有饮料的情况下实施CondimentDecorator,这没有多大意义.组合(而不是继承)是装饰器模式的核心,因此保证每个装饰器实际组成(装饰)其预期目标非常重要.