关于装饰模式和抽象装饰类的问题?

这个问题在这里已经有了答案:

  • 为什么我们需要装饰器设计模式中的装饰器? 4个答案

  • 它使用不同组合的各种装饰器独立装饰基类,而不必为每种可能的组合导出类。 例如,假设你想要牛奶和肉豆蔻的Beverage 。 使用基于抽象装饰器类的装饰器,只需使用MilkNutmeg装饰器进行包装。 如果它来源于Beverage ,那么你必须有一个MilkWithNutmegBeverage类,一个MilkBeverage类和一个NutmegBeverage类。 您可以想象随着可能组合数量的增加,爆炸如何发生。 使用抽象装饰器实现可以减少每个装饰只有一个装饰器类实现。


    迟到一年半的时间比从未如此:

    一个特定接口的装饰器的基类是没有必要的,但它是非常有用的。

    作为记录从它派生的类是所讨论接口的装饰器的一种手段是有用的,但主要是因为装饰器通常不需要为装饰接口的每个单一方法添加功能,所以基础装饰器类允许派生的装饰器只实现它们实际需要添加某些功能的接口的那些方法,而将剩下的方法留给基类来提供默认实现。 (它只是将调用委托给decoree。)

    将其与编写从头开始实现装饰接口的装饰器相对比,编译器要求您为接口的每个单一方法提供实现,无论装饰器是否将添加任何功能。

    这很简单,真的。


    我想知道同样的事情。 回到源代码,GOF Design Patterns,我在Decorator一章的'Implementation'下看到这个:

    “省略抽象装饰器类当你只需要添加一个职责时,就不需要定义一个抽象装饰器类了,当你处理现有的类层次结构而不是设计新的类时,往往是这种情况,在这种情况下,您可以将装饰器的转发请求的响应性合并到具体装饰器中。“

    所以至少在这种情况下,看起来GOF同意你:-)

    我不确定'一个责任'的含义是什么。 我不确定是否有超过“一项责任”的意思是具有多个责任的具体装饰者或具有一个以上责任的具体装饰者。 无论哪种方式,我不明白为什么抽象装饰者是必要的。 我的猜测是,tvanfosson的回答(在他对自己的答案的评论中)是正确的 - 一旦你开始创建许多装饰课程,它就会澄清设计决定,将它们归入一个超类。 另一方面,如果只有一个类,那么如果添加第二个类作为基础组件和装饰器之间毫无意义的中间人,那么它可能会使设计决策变得不那么清晰(话虽如此,你会希望在某些时候添加更多的内容,所以也许最好包括抽象装饰器,即使在单一情况下也是如此......)

    无论如何,看起来好像是为了使设计变得清晰,而不是代码工作与否之间的区别。

    链接地址: http://www.djcxy.com/p/32001.html

    上一篇: Question about decorator pattern and the abstract decorator class?

    下一篇: java.lang.NullPointerException when invoking onLoadFinished()