在有关装饰图案的章节中的“ Head first设计模式(2014年,第二版)”一书中,作者从4个调味品类(牛奶,摩卡,大豆,鞭子)中获取了实例变量Beverage beverage
并将其放入抽象类CondimentDecorator
。 (请参见第110页,getSize()
问题的解决方案)
public abstract class CondimentDecorator extends Beverage{
public Beverage beverage;
public abstract String getDescription();
public Size getSize(){
return beverage.getSize();
}
}
将实例变量
Beverage beverage
从调味品类移动到抽象类CondimentDecorator
的原因是什么?他们这样做是为了节省一些代码行,因为现在调味品不需要声明自己的实例变量,因为它们是从抽象类继承来的?
咖啡店的UML图在它们移动实例变量之前:
最佳答案
比减小代码大小更重要的是,将Beverage
实例移入CondimentDecorator
可以确保每个CondimentDecorator
实际上都有一个Beverage
。否则,有人可以在没有CondimentDecorator
的情况下实现Beverage
,这没有多大意义。
组成(而不是继承)是Decorator模式的核心,因此确保每个装饰器实际上组成(装饰)其预期目标很重要。
关于design-patterns - 将实例变量移动到装饰器模式中的抽象类的原因是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37726343/