首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >装饰器模式与子类

装饰器模式与子类
EN

Stack Overflow用户
提问于 2011-01-30 20:52:27
回答 6查看 24.3K关注 0票数 69

我可以通过添加子类来解决添加功能的问题,那么为什么我要使用装饰器模式呢?装饰器模式的真正优势是什么?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-01-30 21:05:57

来自Decorator pattern at wikipedia

装饰器模式可用于在运行时中扩展(装饰)某个对象的功能。

装饰器模式的全部意义在于动态添加额外的行为/功能,这在设计时当然是不可能的。

摘自同一篇文章:

装饰器模式是子类化的另一种选择。子类化在编译时添加行为,更改会影响原始类的所有实例;修饰可以在运行时为单个对象提供新的行为。

票数 54
EN

Stack Overflow用户

发布于 2011-01-30 21:09:09

来自GoF的示例:

假设你有一个TextView类。然后在某些地方,您需要滚动文本视图,因此您继承了TextView并创建了ScrolledTextView类。而在其他地方,你想要一个围绕文本视图的边框。因此,您可以再次子类化并创建BorderedTextView。好吧,现在在某个地方你想要边框和滚动两者。前面的两个子类都不具备这两个功能。所以你需要创建第三个。在创建ScrolledBorderedTextView时,您实际上是在重复工作。如果您有任何方法可以组合前两个类的功能,则不需要这个类。事情可能会变得更糟,这可能会导致不必要的类爆炸。

基本上,通过使用装饰器模式,您可以在运行时向对象添加任意数量的额外职责,这些职责无法通过子类化实现,而不会潜在地破坏代码结构或为子类添加许多重复的组合。

但是有一件事,设计模式不是你必须使用的东西。

是否需要一个模式取决于你的特定问题,你想不想长时间维护代码,不管你想不想扩展,以及许多其他类似的因素。

并且没有在所有情况下都有用的模式。

适合一种情况的模式(装饰器或其他任何东西)对于另一种情况可能不是一个好的选择。

票数 54
EN

Stack Overflow用户

发布于 2011-01-31 00:01:20

GoF Design Patterns book确定了使用Decorator比子类化的两个主要优点:

  1. 比静态继承更灵活。装饰者模式提供了一种比静态(多重)继承更灵活的方式来向对象添加职责。使用装饰器,只需附加和分离职责,就可以在运行时添加和删除职责。相反,继承需要为每个额外的职责(例如,BorderedScrollableTextView、BorderedTextView)创建一个新类。这会产生许多类,并增加系统的复杂性。此外,为特定的组件类提供不同的装饰器类允许您混合和匹配职责。

装饰器还使得添加两次属性变得很容易。例如,要使TextView具有双边框,只需附加两个BorderDecorators即可。从一个边框类继承两次充其量是容易出错的。

  • 避免了层次结构中较高的功能类。装饰器提供了一种即付即用的方法来添加职责。您可以定义一个简单的类,并使用Decorator对象逐步添加功能,而不是试图在一个复杂的、可定制的类中支持所有可预见的功能。功能可以由简单的片段组成。因此,应用程序不需要为它不使用的功能付费。它也很容易定义新类型的装饰器,独立于它们扩展的对象类,即使是对于不可预见的扩展。扩展一个复杂的类往往会暴露与您添加的职责无关的细节。

在我看来,光是防止子类爆炸就相当有说服力。

如果您有一个TextWindow,您希望使用子类独立地和可选地为其添加所有水平滚动、垂直滚动和边框,如果您关心滚动和边框的顺序,则必须为HorizontalScrollingTextWindowVerticalScrollingTextWindowHorizontalAndVerticalScrollingTextWindowBorderedTextWindowHorizontalScrollingBorderedTextWindowVerticalScrollingBorderedTextWindowHorizontalAndVerticaScrollingBorderedTextWindow等定义子类。

使用decorator,您只需要定义两个滚动装饰器和一个边框装饰器。

票数 22
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4842978

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档