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

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

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

如果您需要来回传递消息会发生什么?您需要注册目标对象的方法吗?

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

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

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

有帮助吗?

解决方案

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

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

观察者模式

其他提示

依赖注入框架如 春天吉斯 通过使用代理来提供 Java 中循环依赖的解决方案,代理可以在第一次需要消息时解析消息的接收者。然而,这不是普遍适用的 OO 模式。

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

如果两个对象相互引用,最终会出现循环依赖关系,在大多数情况下我认为这很糟糕。

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

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

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top