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 - Fatal编程技术网

Design patterns 装饰器模式中的重复属性

Design patterns 装饰器模式中的重复属性,design-patterns,decorator,Design Patterns,Decorator,我打算使用decorator模式,我想知道属性复制…我的意思是,如果基类(被修饰的那个)有很多状态(属性、属性或其他),当你使用decorator模式时,你总是会得到该状态的两个副本,对吗?(装饰课上的那个,装饰课上的那个)总是这样吗 一个类似的问题被问到了,但回答并没有让我更清楚 同样在《头部优先:设计模式》一书中,他们没有提到这种模式的缺点 干杯 对我来说,装饰器不需要存储状态,例如:如果类a有一个方法getTotal(),那么DecoratorA::getTotal()可能返回2*a::g

我打算使用decorator模式,我想知道属性复制…我的意思是,如果基类(被修饰的那个)有很多状态(属性、属性或其他),当你使用decorator模式时,你总是会得到该状态的两个副本,对吗?(装饰课上的那个,装饰课上的那个)总是这样吗

一个类似的问题被问到了,但回答并没有让我更清楚

同样在《头部优先:设计模式》一书中,他们没有提到这种模式的缺点


干杯

对我来说,装饰器不需要存储状态,例如:如果类
a
有一个方法
getTotal()
,那么
DecoratorA::getTotal()
可能返回
2*a::getTotal()

装饰器可以根据它装饰的对象惰性地返回数据。它可能有一些属性(如我的示例中的
2
),但它基本上是带有一些前/后处理的委托


如果成本太高(比如缓存),您最终会存储它,但我想知道如果需要存储每个属性,那么这样的装饰器有什么用呢。返回装饰对象的新实例会更快,其属性基于某种计算。

是的,我同意装饰器不需要存储状态……但由于它也是装饰对象的实例,它自动拥有装饰对象的所有属性(尽管它可能不需要或想要它们)对还取决于您是否使用接口或抽象。如果您为装饰器进行继承,那么您可能应该基于另一个对象创建一个新的对象——比如说一个装饰器具有一个恒定的状态,即使装饰对象发生变化也不会改变——但我不会称之为装饰器。