我尝试了解装饰器模式,并在"Head First Design Patterns"
中阅读后发生了一个问题。
如果我不使用abstact component interface
并让我的装饰器继承Beverage class
,我会获得相同的功能。我不知道abstract decorator
有什么好处。
让我向您展示如果没有abstract component
我的类结构是什么样的(这是在vb中,但语句应该可以用任何其他语言轻松翻译):
有人可以向我解释,为什么我需要抽象装饰类?
答案 0 :(得分:2)
如果直接从Beverage继承,则所有装饰器类都需要声明并维护它自己装饰的具体组件的引用。在您的示例代码中,Milk类需要在变量myBeverage中维护引用。
因此,如果您直接继承,它将在所有装饰器类(Milk,Mocha等)中创建代码重复
对所有装饰器使用公共类的另一个优点是,如果需要,它为Beverage类中定义的方法提供默认实现,装饰器类只需要覆盖它想要添加扩展行为的方法。例如。让我们假设您的所有装饰者(牛奶,摩卡咖啡等)具有相同的价格,只有描述不同。因此,在CondimentDecorator中,它可以为cost()提供委托给具体组件的默认实现。所有装饰者不再需要实现此cost()方法