我在使用装饰器模式的类中遇到问题。
当内部对象在对其他对象的调用中使用“this”引用时,就会出现问题。这将导致来自接收到“this”引用的对象的所有调用直接针对内部对象,而无需先经过外部对象。
解决此问题的常用方法是什么?
谢谢。
最佳答案
对象具有一个隐式值:它们的身份(可以通过应用==
进行测试)。包装它们时,您实际上隐藏了该标识(更糟的是,您还公开了一个潜在的误导性标识,即包装程序本身的标识)。因此,一种显而易见的方法是通过另一种方式(显式地)公开对象的身份来对此进行补偿。例如。您可能会引入Object getIdentity()
方法,该方法返回一个真正代表预期身份的对象,并允许将==
应用于该对象。
巨大的缺点是,您仍然允许装饰器本身使用==
,例如危害:
identity == decorator
而不是identity == decorator.getIdentity()
)例如,如果对象具有如下方法,则该问题将不存在:
protected Object getIdentity() {
return this;
}
在哪个
==
运算符上进行定义,因此包装器也可以包装被包装对象的标识,而不用自己的对象替换。