Design patterns 装饰器模式中的抽象组件是多余的吗?
我试图理解Decorator模式,在阅读了Design patterns 装饰器模式中的抽象组件是多余的吗?,design-patterns,decorator,Design Patterns,Decorator,我试图理解Decorator模式,在阅读了“Head-First设计模式”之后,出现了一个问题 如果我只是不使用absact组件接口,而让我的装饰程序继承饮料类,我就得到了相同的功能。我不知道抽象装饰器有什么用 让我向您展示我的类结构在没有抽象组件的情况下是什么样子的(这是用vb编写的,但是语句应该可以很容易地翻译成任何其他语言): 有人能给我解释一下,为什么我需要抽象装饰类吗? 如果您直接从Beverage继承,那么所有decorators类都需要声明并维护它自己装饰的具体组件的引用。在示
“Head-First设计模式”
之后,出现了一个问题
如果我只是不使用absact组件接口
,而让我的装饰程序继承饮料类
,我就得到了相同的功能。我不知道抽象装饰器
有什么用
让我向您展示我的类结构在没有抽象组件的情况下是什么样子的(这是用vb编写的,但是语句应该可以很容易地翻译成任何其他语言):
有人能给我解释一下,为什么我需要抽象装饰类吗?
- 如果您直接从Beverage继承,那么所有decorators类都需要声明并维护它自己装饰的具体组件的引用。在示例代码中,Milk类需要在变量myBeverage中维护引用
- 所以,如果您直接继承,它将在所有decorators类(Milk、Mocha等)中创建代码复制
- 对所有decorator使用公共类还有一个优点,就是它为类中定义的方法提供了默认实现。如果需要,decorator类只需要覆盖它想要添加扩展行为的方法。例如,假设你所有的装饰师(牛奶、摩卡咖啡等)都有相同的价格,只是描述不同。所以在ConditionDecorator中,它可以为委托给具体组件的cost()提供默认实现。所有的装饰器不再需要实现这个cost()方法
- 如果您直接从Beverage继承,那么所有decorators类都需要声明并维护它自己装饰的具体组件的引用。在示例代码中,Milk类需要在变量myBeverage中维护引用
- 所以,如果您直接继承,它将在所有decorators类(Milk、Mocha等)中创建代码复制
- 对所有decorator使用公共类还有一个优点,就是它为类中定义的方法提供了默认实现。如果需要,decorator类只需要覆盖它想要添加扩展行为的方法。例如,假设你所有的装饰师(牛奶、摩卡咖啡等)都有相同的价格,只是描述不同。所以在ConditionDecorator中,它可以为委托给具体组件的cost()提供默认实现。所有的装饰器不再需要实现这个cost()方法
- 如果您直接从Beverage继承,那么所有decorators类都需要声明并维护它自己装饰的具体组件的引用。在示例代码中,Milk类需要在变量myBeverage中维护引用
- 所以,如果您直接继承,它将在所有decorators类(Milk、Mocha等)中创建代码复制
- 对所有decorator使用公共类还有一个优点,就是它为类中定义的方法提供了默认实现。如果需要,decorator类只需要覆盖它想要添加扩展行为的方法。例如,假设你所有的装饰师(牛奶、摩卡咖啡等)都有相同的价格,只是描述不同。所以在ConditionDecorator中,它可以为委托给具体组件的cost()提供默认实现。所有的装饰器不再需要实现这个cost()方法
- 如果您直接从Beverage继承,那么所有decorators类都需要声明并维护它自己装饰的具体组件的引用。在示例代码中,Milk类需要在变量myBeverage中维护引用
- 所以,如果您直接继承,它将在所有decorators类(Milk、Mocha等)中创建代码复制
- 对所有decorator使用公共类还有一个优点,就是它为类中定义的方法提供了默认实现。如果需要,decorator类只需要覆盖它想要添加扩展行为的方法。例如,假设你所有的装饰师(牛奶、摩卡咖啡等)都有相同的价格,只是描述不同。所以在ConditionDecorator中,它可以为委托给具体组件的cost()提供默认实现。所有的装饰器不再需要实现这个cost()方法