装饰器模式中的抽象组件是多余的吗?

时间:2014-11-12 09:34:28

标签: design-patterns decorator

我尝试了解装饰器模式,并在"Head First Design Patterns"中阅读后发生了一个问题。

enter image description here

如果我不使用abstact component interface并让我的装饰器继承Beverage class,我会获得相同的功能。我不知道abstract decorator有什么好处。

让我向您展示如果没有abstract component我的类结构是什么样的(这是在vb中,但语句应该可以用任何其他语言轻松翻译):

enter image description here

有人可以向我解释,为什么我需要抽象装饰类?

1 个答案:

答案 0 :(得分:2)

  • 如果直接从Beverage继承,则所有装饰器类都需要声明并维护它自己装饰的具体组件的引用。在您的示例代码中,Milk类需要在变量myBeverage中维护引用。

  • 因此,如果您直接继承,它将在所有装饰器类(Milk,Mocha等)中创建代码重复

  • 对所有装饰器使用公共类的另一个优点是,如果需要,它为Beverage类中定义的方法提供默认实现,装饰器类只需要覆盖它想要添加扩展行为的方法。例如。让我们假设您的所有装饰者(牛奶,摩卡咖啡等)具有相同的价格,只有描述不同。因此,在CondimentDecorator中,它可以为cost()提供委托给具体组件的默认实现。所有装饰者不再需要实现此cost()方法