Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 成本装饰师_Design Patterns_Decorator_Strategy Pattern - Fatal编程技术网

Design patterns 成本装饰师

Design patterns 成本装饰师,design-patterns,decorator,strategy-pattern,Design Patterns,Decorator,Strategy Pattern,对于每种产品都有相关的成本计算器,如:折扣、商户折扣、商户奖金、每月折扣等。将来,将添加更多的成本计算器 我们有一个具体的产品类别,每个成本计算都有许多装饰师。所有产品都应使用所有计算器,因为计算器决定根据产品属性(如产品商户id、类别id、颜色等)应用其计算 而且,我们的系统中有数以百万计的产品需要计算。所以,我们最好把装潢过的计算器缓存起来。因为,在运行时装饰每个产品实体会很昂贵。但这对装饰图案来说很难。在我们的情况下使用这种模式似乎是一种气味 你有什么建议?我们应该使用装饰师、战略还是责任

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

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

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


你有什么建议?我们应该使用装饰师、战略还是责任链模式?或者没有模式。

在策略模式中,对象的意图会改变


因此,我认为战略将是一个很好的选择

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

因此,我认为战略将是一个很好的选择

所有产品应使用所有 计算器,因为计算器 决定通过以下方式应用他们的计算: 产品的属性与产品相似 商户id、类别id、颜色等

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

应该仅在必要时将装饰器应用于产品,并且只应用那些需要的装饰器

我认为你应该把决定权从装饰者身上移开;其他的东西应该决定是否应用decorator,在这种情况下,它将产品包装在适当的decorator中。这样你就知道,如果一个产品被包装在一个装饰器中,这个装饰器会影响(影响?)这个产品

所有产品应使用所有 计算器,因为计算器 决定通过以下方式应用他们的计算: 产品的属性与产品相似 商户id、类别id、颜色等

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

应该仅在必要时将装饰器应用于产品,并且只应用那些需要的装饰器


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

装饰器根据产品属性进行计算,我们循环一个产品列表,将这些计算应用于所有产品。因此,在每次迭代中对这些产品进行装饰,我们认为缓存计算逻辑是个好主意。但这是很难做到的装饰。所以,更好的方法是将策略模式作为一个集合/获取产品。产品p=新产品();p、 setCalculationStrategy(计算器列表);p、 价格();//将调用所有计算器,只有感兴趣的计算器将calculatep.price(){return list of calculators.price();}list of calculators.price(){每个计算器执行{/..}返回价格;}装饰器根据产品属性执行计算,我们在产品列表上循环,将这些计算应用于所有产品。因此,在每次迭代中对这些产品进行装饰,我们认为缓存计算逻辑是个好主意。但这是很难做到的装饰。所以,更好的方法是将策略模式作为一个集合/获取产品。产品p=新产品();p、 setCalculationStrategy(计算器列表);p、 价格();//将调用所有计算器,只有感兴趣的计算器将calculatep.price(){return listOfCalculators.price();}listOfCalculators.price(){每个计算器执行{//..}返回价格;}