我在使用装饰器模式的类中遇到问题。

当内部对象在对其他对象的调用中使用“this”引用时,就会出现问题。这将导致来自接收到“this”引用的对象的所有调用直接针对内部对象,而无需先经过外部对象。

解决此问题的常用方法是什么?

谢谢。

最佳答案

对象具有一个隐式值:它们的身份(可以通过应用==进行测试)。包装它们时,您实际上隐藏了该标识(更糟的是,您还公开了一个潜在的误导性标识,即包装程序本身的标识)。因此,一种显而易见的方法是通过另一种方式(显式地)公开对象的身份来对此进行补偿。例如。您可能会引入Object getIdentity()方法,该方法返回一个真正代表预期身份的对象,并允许将==应用于该对象。

巨大的缺点是,您仍然允许装饰器本身使用==,例如危害:

  • 很自然,可以被欺骗(identity == decorator而不是identity == decorator.getIdentity())
  • 默默地做错了事(与运行时异常进行比较-祝你好运调试)

  • 例如,如果对象具有如下方法,则该问题将不存在:
    protected Object getIdentity() {
        return this;
    }
    

    在哪个==运算符上进行定义,因此包装器也可以包装被包装对象的标识,而不用自己的对象替换。

    10-06 15:20