在有关装饰图案的章节中的“ 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图在它们移动实例变量之前:

design-patterns - 将实例变量移动到装饰器模式中的抽象类的原因是什么?-LMLPHP

最佳答案

比减小代码大小更重要的是,将Beverage实例移入CondimentDecorator可以确保每个CondimentDecorator实际上都有一个Beverage。否则,有人可以在没有CondimentDecorator的情况下实现Beverage,这没有多大意义。

组成(而不是继承)是Decorator模式的核心,因此确保每个装饰器实际上组成(装饰)其预期目标很重要。

关于design-patterns - 将实例变量移动到装饰器模式中的抽象类的原因是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37726343/

10-12 06:05