对象之间传递消息-如何引用目标对象?
时间: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();
我认为这很大程度上取决于两个对象之间的确切关系。