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
Design patterns 什么时候适合为对象创建装饰器,什么时候适合重写对象以允许应用策略?_Design Patterns_Decorator_Strategy Pattern - Fatal编程技术网

Design patterns 什么时候适合为对象创建装饰器,什么时候适合重写对象以允许应用策略?

Design patterns 什么时候适合为对象创建装饰器,什么时候适合重写对象以允许应用策略?,design-patterns,decorator,strategy-pattern,Design Patterns,Decorator,Strategy Pattern,例如,假设我有一个可以添加到购物车的产品类。我可能希望能够包装它与其他项目时,它也在购物车,并添加15%的折扣 产品类应该用允许交易的新子类装饰,还是应该重新设计产品类以允许购物车将降价“策略”对象附加到产品上,从而降低价格 这是一个抽象的例子,你可以随意使用 看看你的域名 若它是一个允许降价的产品(嗯……我不这么认为),那个么你们应该把它添加到产品中。 如果是订单(imo,打折的正确地点),那么它应该在那里。装饰器是您可以应用的入侵性最小的模式之一-当您这样做时,您遵循打开/关闭原则,因为您的

例如,假设我有一个可以添加到购物车的产品类。我可能希望能够包装它与其他项目时,它也在购物车,并添加15%的折扣

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


这是一个抽象的例子,你可以随意使用

看看你的域名

若它是一个允许降价的产品(嗯……我不这么认为),那个么你们应该把它添加到产品中。
如果是订单(imo,打折的正确地点),那么它应该在那里。

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

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


请注意,策略通常是可以修饰的…

但是购物车项目不是订单,在适当的时候应该有/显示折扣..您在这里使用了一个词,我将在我的回答中包括:“注射”。我倾向于把注射和策略放在一起。我倾向于将装饰视为对现有功能的添加,我倾向于使用装饰器,尤其是当我的'child.SomeMethod()'方法调用'base.SomeMethod()'时。因此,使用这个精心设计的示例,您可能会说,让购物车“识别”交易更合适,将购物车中的产品包装成“折扣产品”装饰师课程?如书面所示,是的。事实上,当涉及到产品和手推车时,您可能希望了解原始价格以及折扣价格,以便能够报告节省的金额,在这种情况下,示例就不适用了。