Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 装饰器模式中的抽象组件是多余的吗?_Design Patterns_Decorator - Fatal编程技术网

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

Design patterns 装饰器模式中的抽象组件是多余的吗?,design-patterns,decorator,Design Patterns,Decorator,我试图理解Decorator模式,在阅读了“Head-First设计模式”之后,出现了一个问题 如果我只是不使用absact组件接口,而让我的装饰程序继承饮料类,我就得到了相同的功能。我不知道抽象装饰器有什么用 让我向您展示我的类结构在没有抽象组件的情况下是什么样子的(这是用vb编写的,但是语句应该可以很容易地翻译成任何其他语言): 有人能给我解释一下,为什么我需要抽象装饰类吗? 如果您直接从Beverage继承,那么所有decorators类都需要声明并维护它自己装饰的具体组件的引用。在示

我试图理解Decorator模式,在阅读了
“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()方法