【问题标题】:Cost decorators成本装饰师
【发布时间】:2009-06-01 09:29:50
【问题描述】:

对于每个产品,都有相关的成本计算器,例如:折扣、商家折扣、商家奖金、每月折扣等。未来,将添加更多成本计算器。

对于每个成本计算,我们都有一个具体的产品类别和许多装饰器。所有产品都应使用所有计算器,因为计算器决定根据产品的属性(如产品商家 ID、类别 ID、颜色等)应用其计算。

而且,我们的系统中有数百万种产品需要计算。所以,我们最好缓存装饰过的计算器。因为,在运行时装饰每个产品实体会很昂贵。但这对于装饰器模式来说很难。在我们的情况下使用这种模式似乎有点味道。

你有什么建议?我们应该使用装饰器、策略还是责任链模式?或无模式。

【问题讨论】:

    标签: design-patterns decorator strategy-pattern


    【解决方案1】:

    在策略模式中,对象的意图会发生变化。

    因此,我认为策略是一个不错的选择。

    【讨论】:

      【解决方案2】:

      所有产品都应使用所有 计算器,因为计算器 决定应用他们的计算 产品的属性,如产品 商家 ID、类别 ID、颜色等。

      如果您需要让所有产品都使用所有装饰器,那么您并没有真正从该模式中获得任何好处。这是否意味着如果您实现一个新的装饰器,所有现有的实体都必须更新以使用该新的装饰器?

      装饰器应该只在必要时应用到产品上,并且只应用那些需要的装饰器。

      我认为您应该从装饰器中删除决定;其他东西应该决定是否应用装饰器,在这种情况下,它将产品包装在适当的装饰器中。这样你就知道如果一个产品被包装在一个装饰器中,那个装饰器正在影响(影响?)这个产品。

      【讨论】:

      • 装饰器根据产品属性进行计算,我们在产品列表上循环以将这些计算应用于所有产品。所以,在每次迭代中装饰这些产品,我们认为缓存计算逻辑是个好主意。但这很难用装饰器来做。因此,更好的方法是将策略模式用作产品的设置/获取。产品 p = 新产品(); p.setCalculationStrategy(listOfCalculators); p.price(); // 将调用所有的计算器,只有感兴趣的计算器会计算
      • p.price() { return listOfCalculators.price(); } listOfCalculators.price() { 每个计算器都做 { //.... } return price; }
      猜你喜欢
      • 2011-09-22
      • 2010-10-16
      • 2011-02-11
      • 2012-04-10
      • 2012-02-09
      • 1970-01-01
      • 1970-01-01
      • 2012-12-07
      • 2022-01-09
      相关资源
      最近更新 更多