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

时间:2020-12-22 18:15:20

标签: oop object design-patterns decorator

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

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

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

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

1 个答案:

答案 0 :(得分:1)

<块引用>

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

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

<块引用>

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

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

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

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

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

一个集合需要你,

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

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