【问题标题】:Is the abstract component in the decorator pattern redundant?装饰器模式中的抽象组件是多余的吗?
【发布时间】:2014-11-12 09:34:27
【问题描述】:
我尝试理解装饰器模式,在"Head First Design Patterns" 中阅读后出现了一个问题。
如果我不使用 abstact component interface 并让我的装饰器从 Beverage class 继承,我将获得相同的功能。我不明白abstract decorator 有什么用处。
让我向您展示我的类结构在没有abstract component 的情况下是什么样子(这是在 vb 中,但这些语句应该很容易翻译成任何其他语言):
谁能解释一下,为什么我需要抽象装饰器类?
【问题讨论】:
标签:
design-patterns
decorator
【解决方案1】:
如果直接从 Beverage 继承,所有装饰器类都需要声明和维护它自己装饰的具体组件的引用。在您的示例代码中,Milk 类需要在变量 myBeverage 中维护引用。
因此,如果您直接继承,则会在所有装饰器类(Milk、Mocha 等)中创建代码重复
对所有装饰器使用公共类还有一个好处是,如果需要,它为饮料类中定义的方法提供默认实现,装饰器类只需要覆盖它想要添加扩展行为的方法。例如。假设您所有的装饰器(牛奶、摩卡等)价格相同,只是描述不同。所以在 CondimentDecorator 中,它可以为 cost() 提供一个默认实现,委托给具体组件。所有的装饰器都不再需要实现这个 cost() 方法了