微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么要使用装饰器模式?

如何解决为什么要使用装饰器模式?

我正在观看有关设计模式的课程,他们用于装饰器模式的示例是 Pizza 和 Toppings 示例(您也可以找到示例 here)。 请查看链接以了解我的问题

正如我添加链接评论中提到的那样,我不喜欢这种模式的一点是浇头不是比萨饼,那么为什么它要继承比萨饼类?

我想到的解决方案是在 PizzaDecorators 对象中使用 Pizza 对象数组,并使用该数组在比萨饼中添加删除配料。

这个解决方案不是比使用装饰器模式简单得多吗?为什么要考虑在这种情况下使用装饰器模式?

解决方法

...浇头不是披萨,为什么要继承披萨类?

此评论在后续评论中得到了回答:只是命名问题。每个浇头都应命名为 PizzaWithTopping

...使用数组添加或删除比萨的配料?

这个解决方案做了几个假设。

  • 您拥有 Pizza 课程吗?您可能正在为特定商店制作比萨饼,其中 Pizza 由特许经营权决定。特许经营控制质量的一种方式是不允许个别商店编辑基本的 Pizza 代码。
  • Pizza 对象是否可变?可变性导致了不变性可以避免的错误。这是一个比仅仅编辑数组更大的架构决策。

我们为什么要考虑在这种情况下使用装饰器模式?

装饰器模式相对于“增强集合”的主要优点是装饰器遵守 Open-Closed Principle。装饰器同样适用于任何类,无论您是否拥有它,也无论增强是否可预见。

一个集合需要你,

  • 通过向每个基类添加一组(具有正确界面的增强功能)来展望未来并提前计划,或者...
  • 在违反 OCP 的情况下编辑现有基类。

在像 Pizza 这样知名且相对较小的域中,这可能不是一个严重的问题。也许浇头永远不会比通过单个 API 一次添加一个更复杂。但是使用装饰器,您可以使用任何一种方式。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。