【问题标题】:Message passing between objects - How to refer to the target object?对象之间的消息传递 - 如何引用目标对象?
【发布时间】:2008-09-19 04:43:25
【问题描述】:

面向对象环境中最基本的任务是在对象上执行方法。为此,您必须拥有对正在调用该方法的对象的引用。建立此引用以将对象作为参数传递给调用对象的构造函数(或初始化方法)的正确方法是什么?

如果对象 foo 调用对象 bar,是否正确说(在伪代码中):

bar = new barClass()
foo = new fooClass(bar)

如果您需要来回传递消息会怎样?需要注册目标对象的方法吗?

foo = new fooClass()
bar = new barClass()

foo.register(bar)
bar.register(foo)

有解决这个问题的模式吗?

【问题讨论】:

    标签: oop message-passing


    【解决方案1】:

    像Spring 和Guice 这样的依赖注入框架通过使用代理来解决Java 中的循环依赖,该代理可以在第一次需要时解析消息的接收者。然而,这不是一个普遍适用的 OO 模式。

    【讨论】:

    • 谢谢!我花了一点时间研究 Spring,但并不多。我一定会更深入地研究。
    【解决方案2】:

    通常依赖注入是要走的路。如果您只是在谈论两个对象进行通信,那么将其中一个的实例作为参数传递给另一个,就像在您的第一个示例中一样。传入构造函数确保引用始终有效。否则,您必须进行测试以确保已调用 register 。此外,您需要确保多次调用 register 不会产生不利影响。

    如果你想要一个控制对象,其他对象注册事件怎么办。然后适合使用 Register 方法(可以添加到委托)。

    见Observer Pattern

    【讨论】:

      【解决方案3】:

      嗯,根据消息传递的级别,您可以实现消息传递服务。对象侦听消息,或在某个 MessageProvider 上注册为 MessageListener。

      如果两个对象相互引用,你最终会得到循环依赖,在大多数情况下我会认为这是不好的。

      【讨论】:

      • 谢谢!如果您有许多对象可以响应的消息,这将是有意义的。我对两个对象非常紧密耦合并相互交谈的一般情况更感兴趣。 OOP-101 类型的东西。 :)
      【解决方案4】:

      您的一个对象类型可能是另一个对象类型的工厂。当 Foo 弹出一个新 Bar 时,连接已经建立:

      foo = new Foo();
      bar = Foo.Poop();
      
      function Foo::Poop()
      {
          bar = new Bar(this);
          myChildren.Add(bar);
          return bar;
      }
      
      bar.SayHiToParent();
      foo.SayHiToChildren();
      

      【讨论】:

        【解决方案5】:

        我认为这在很大程度上取决于两个对象之间的确切关系。

        【讨论】:

          猜你喜欢
          • 2021-09-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-08-27
          • 2011-01-21
          • 1970-01-01
          • 2013-06-11
          相关资源
          最近更新 更多