对象之间传递的消息 - 如何引用目标对象?

时间:2008-09-19 04:43:26

标签: oop message-passing

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

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

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

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

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

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

是否有解决此问题的模式?

5 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

一般来说,依赖注入是可行的方法。如果您只是在谈论两个对象进行通信,那么将一个实例作为参数传递给另一个,如第一个示例所示。传入构造函数确保引用始终有效。否则,您必须进行测试以确保已调用寄存器。此外,您需要确保多次调用寄存器不会产生不利影响。

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

请参阅Observer Pattern

答案 2 :(得分:0)

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

如果两个对象相互引用,你最终会遇到周期性的依赖关系,在大多数情况下我认为这是不好的。

答案 3 :(得分:0)

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

foo = new Foo();
bar = Foo.Poop();

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

bar.SayHiToParent();
foo.SayHiToChildren();

答案 4 :(得分:0)

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