【发布时间】:2018-02-02 12:09:43
【问题描述】:
我正在阅读“Head first design patterns book”中提供的关于装饰模式的示例。
我注意到两件事:
- 如果您需要从封装的装饰器堆栈中移除一个装饰器,则必须逐个遍历组件引用,这是 O(n) 复杂度。
- 从概念上讲,我发现将基本组件包装(封装)到装饰器对象中是错误的。应该颠倒过来;组件对象应该封装装饰对象。
我是设计模式的新手,很有可能我错了。请向我解释一下我的思维方式有什么特别的问题,以便我可以学习。
我创建了一个不同的设计,它解决了我提到的问题。也许他们会增加新的问题;请随时指出问题。
这是建议的UML图:
基本上我所做的是在 Component 类中创建了一个字典,用于保存已添加的装饰器,并使 Decorator 抽象类不从组件继承自接口(因此组件抽象类)。
通过这种方式,我们可以移除任何我们想要的装饰,复杂度为 O(1),并且更符合逻辑地构造为组件包装装饰器的方式,而不是反之。
我知道我可能没有注意到原始装饰图案设计的一些优势。请给我建议。
这是我的代码url。
编辑:
客户何时需要移除装饰器的示例:
例如说客户选择调味品,他正在添加鞭子,去除焦糖,每次查看总价格如何变化,基于客户选择添加为装饰者。
【问题讨论】:
-
首先,您能否详细说明一下为什么您认为在 StarBuzz 案例中动态删除装饰器会很有用? (我可以想象一个原因,但如果你是明确的,你的问题会更好)。其次,您认为 StarBuzz 场景中的典型 n 类型是什么?我猜 max(n) 可能是 20,所以迭代这么多迭代器不太可能成为现代计算机的问题。
-
我在主要问题中包含了这个例子,它解释了客户何时需要移除装饰器,但我想我开始明白你的意思了,可以扭曲的装饰器的最大数量是 20 ,所以是的,对于这个数量使用 O(n) 解决方案是完全合乎逻辑的,请将其写为答案,以便我接受。
标签: c# design-patterns decorator composition