java - 如何处理装饰器模式中的 'this' 引用

标签 java design-patterns decorator

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

当内部对象在对其他对象的调用中使用“this”引用时,就会出现问题。这会导致从接收到“this”引用的对象直接调用内部对象,而不先通过外部对象。

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

谢谢。

最佳答案

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

但最大的缺点是你仍然允许装饰器本身使用 == ,例如一种危险:

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

例如,如果对象具有如下方法,则问题将不存在:

protected Object getIdentity() {
    return this;
}

将定义 == 运算符,因此包装器也可以包装被包装对象的身份,而不是用自己的身份替换它。

关于java - 如何处理装饰器模式中的 'this' 引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3919777/

相关文章:

c# - 装饰模式问题C#/java

java - OpenWebbeans CDI 装饰器抛出 InspirationTargetException

Java EBICS 客户端

java - InputStream 当部分名称已知时? (安卓)

asp.net-mvc - 与使用 HTML + Javascript + Services 应用程序相比,使用传统 MVC 框架有哪些优势?

java - 是否有使用 GWT 在 MVP 中使用观察者模式的推荐方法?

php - 纠正装饰者模式的一大缺点

java - 无法解析 com.badlogic.gdx.ApplicationListener 类型

具有 SSL 身份验证的 Java SOAP 客户端 : bad certificate

c++ - 干净的 C++ 颗粒 friend 等价物? (答案: Attorney-Client Idiom)