代码之家  ›  专栏  ›  技术社区  ›  monoceres

如何在decorator模式中处理“this”引用

  •  5
  • monoceres  · 技术社区  · 14 年前

    我的一个使用decorator模式的类有一个问题。

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

    谢谢。

    3 回复  |  直到 14 年前
        1
  •  2
  •   Dimitris Andreou    14 年前

    对象有一个隐式值:它们的标识(可以通过应用 == ). 包装它们时,实际上隐藏了该标识(更糟的是,还暴露了一个潜在的误导标识,即包装器本身的标识)。因此,一种明显的方法是通过另一种方式(显式地)公开对象的标识来补偿这一点。E、 g.你可以介绍一种方法 Object getIdentity() ,它返回一个真正表示预期标识的对象,并允许应用 ==

    但最大的缺点是你仍然允许 == 在装修者身上,例如:

    • identity == decorator 而不是 identity == decorator.getIdentity()
    • 默默地做错误的事情(与运行时异常相比-祝你调试成功)

    例如,如果对象的方法如下:

    protected Object getIdentity() {
        return this;
    }
    

    == 运算符将被定义,因此包装器也可以包装包装对象的标识,而不是将其替换为自己的标识。

        2
  •  1
  •   usr-local-ΕΨΗΕΛΩΝ    14 年前

    一般来说,你不能。除非你将你的装饰类子类化,否则你的 内部的

    引用(引用装饰器本身)到其他方法。在我看来,decorator与代理最相似:内部装饰对象完全封装在其decorator中,不能直接访问。因此,您必须自己找到一种方法,禁止您的装饰对象直接访问其他对象并能够通过 this 参考

        3
  •  1
  •   Huperniketes    14 年前

    您所描述的是decorator和模板模式的混合。decorator模式允许动态地向对象添加行为(通过使用类似代理的机制)。模板模式将一个算法分解为几个方法,因此您可以通过子类化替换方法来改变对象的行为,或者在您的情况下,通过decorator替换方法。

    因此,每次通过添加或删除最外层的装饰器来更改目标对象的行为时,您的设计要么需要用对其最外层装饰器的引用更新目标对象,要么目标对象需要查询另一个对象以获取最外层的装饰器引用。