我可以通过添加子类来解决添加功能的问题,那么为什么我要使用装饰器模式呢?装饰器模式的真正优势是什么?
发布于 2011-01-30 21:05:57
来自Decorator pattern at wikipedia
装饰器模式可用于在运行时中扩展(装饰)某个对象的功能。
装饰器模式的全部意义在于动态添加额外的行为/功能,这在设计时当然是不可能的。
摘自同一篇文章:
装饰器模式是子类化的另一种选择。子类化在编译时添加行为,更改会影响原始类的所有实例;修饰可以在运行时为单个对象提供新的行为。
发布于 2011-01-30 21:09:09
来自GoF的示例:
假设你有一个TextView类。然后在某些地方,您需要滚动文本视图,因此您继承了TextView并创建了ScrolledTextView类。而在其他地方,你想要一个围绕文本视图的边框。因此,您可以再次子类化并创建BorderedTextView。好吧,现在在某个地方你想要边框和滚动两者。前面的两个子类都不具备这两个功能。所以你需要创建第三个。在创建ScrolledBorderedTextView时,您实际上是在重复工作。如果您有任何方法可以组合前两个类的功能,则不需要这个类。事情可能会变得更糟,这可能会导致不必要的类爆炸。
基本上,通过使用装饰器模式,您可以在运行时向对象添加任意数量的额外职责,这些职责无法通过子类化实现,而不会潜在地破坏代码结构或为子类添加许多重复的组合。
但是有一件事,设计模式不是你必须使用的东西。
是否需要一个模式取决于你的特定问题,你想不想长时间维护代码,不管你想不想扩展,以及许多其他类似的因素。
并且没有在所有情况下都有用的模式。
适合一种情况的模式(装饰器或其他任何东西)对于另一种情况可能不是一个好的选择。
发布于 2011-01-31 00:01:20
GoF Design Patterns book确定了使用Decorator比子类化的两个主要优点:
装饰器还使得添加两次属性变得很容易。例如,要使TextView具有双边框,只需附加两个BorderDecorators即可。从一个边框类继承两次充其量是容易出错的。
在我看来,光是防止子类爆炸就相当有说服力。
如果您有一个TextWindow,您希望使用子类独立地和可选地为其添加所有水平滚动、垂直滚动和边框,如果您关心滚动和边框的顺序,则必须为HorizontalScrollingTextWindow、VerticalScrollingTextWindow、HorizontalAndVerticalScrollingTextWindow、BorderedTextWindow、HorizontalScrollingBorderedTextWindow、VerticalScrollingBorderedTextWindow、HorizontalAndVerticaScrollingBorderedTextWindow等定义子类。
使用decorator,您只需要定义两个滚动装饰器和一个边框装饰器。
https://stackoverflow.com/questions/4842978
复制相似问题