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

时间:2020-03-06 14:24:44  来源:igfitidea点击:

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

如果对象foo调用了对象bar,那么用伪代码说是正确的:

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

如果我们需要来回传递消息怎么办?我们是否需要注册目标对象的方法?

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

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

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

解决方案

好吧,根据消息传递的级别,我们可以实现消息传递服务。对象侦听消息,或者在某些MessageProvider上注册为MessageListener。

如果两个对象之间有相互引用,最终将导致周期性依赖关系,在大多数情况下,我认为这是不好的。

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

通常,依赖注入是要走的路。如果我们只是在谈论两个对象之间的通信,则将第一个示例中的一个实例作为参数传递给另一个。传入构造函数可确保引用始终有效。否则,我们必须测试以确保已调用寄存器。另外,我们还需要确保多次调用注册不会产生不利影响。

如果我们想要一个控制对象,其他对象向其注册事件该怎么办。然后使用Register方法(可能会添加到委托中)将是合适的。

请参阅观察者模式

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

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

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

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

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