【问题标题】:When is it appropriate to create a Decorator for an object, and when is it appropriate to rewrite your object to allow Strategies to be applied?什么时候适合为对象创建装饰器,什么时候适合重写对象以允许应用策略?
【发布时间】:2009-11-14 01:24:49
【问题描述】:

例如,假设我有一个可以添加到购物车的 Product 类。当它也在购物车中时,我可能希望能够将它与另一件商品一起打包并添加 15% 的折扣。

应该用允许交易的新子类来装饰产品类,还是应该重新设计产品类以允许购物车将降价“策略”对象附加到产品,从而降低价格?

这是一个抽象的例子,所以随它去吧。

【问题讨论】:

    标签: design-patterns decorator strategy-pattern


    【解决方案1】:

    装饰器是您可以应用的侵入性最小的模式之一 - 当您这样做时,您遵循开放/封闭原则,因为您的原始类永远不会被修改。我倾向于尽可能使用装饰器。当原始类不需要与扩展进行交互时,通常会出现这种情况。

    注入策略更具侵入性,因为必须修改获取策略的类以接受策略(显然,一旦您进行了此修改,您可以应用许多不同的策略而无需进一步修改您的类)。当原始类需要与策略交互时(例如,向它询问某事),我会使用策略。

    请注意,策略通常可以被装饰......

    【讨论】:

    • 您在这里使用了一个词,我将在我的回答中包含这个词:“注入”。我倾向于将注入和策略放在一起。我倾向于将装饰视为对现有功能的添加,并且我倾向于使用装饰器,特别是当我的 'child.SomeMethod()' 方法调用 'base.SomeMethod()'
    • 所以使用这个人为的例子,你会说让购物车“识别”交易,将购物车中的产品包装在“折扣产品”装饰器类中会更合适?跨度>
    • 如所写,是的。实际上,当涉及到产品和购物车时,您可能想知道原始价格以及折扣价,以便能够报告节省的金额,在这种情况下,示例就失效了。
    【解决方案2】:

    看看你的域名。

    如果它是允许降价的产品(嗯...我不这么认为)那么你应该将它添加到产品中。 如果是订单(imo,打折的好地方),那么它应该在那里。

    【讨论】:

    • 但是购物车中的商品不是订单,应该在适当的时候有/显示折扣..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-13
    • 2010-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-23
    • 2013-05-02
    相关资源
    最近更新 更多