Java观察者导致循环继承问题

4
假设我有两个类:具有属性 A.a 的类 A 和具有属性 B.b 的类 B。
A 中的一些属性依赖于 B.b,但 A.a 不依赖于 B.b。
B 中的一些属性依赖于 A.a,但 B.b 不依赖于 A.a。
我希望 A 能够在 B.b 更改时得到通知,并且 B 能够在 A.a 更改时得到通知。如果我使用标准观察者模式:
public class A implements B.Observer {..}

public class B implements A.Observer {..}

我遇到了编译错误:

涉及 B(或 A)的循环继承。

我知道这可能会导致一般情况下的无限循环,但在这种情况下并不会。例如,如果 A.a 发生变化,A 会通知 B。但是由于 A.aB.b 没有影响,因此没有返回通知给 A,也没有循环。

我感谢 Java 正在尝试防止一般问题,但我需要以某种方式实现它。有什么建议吗?


4
看起来你试图通过继承去解决一个不应该通过继承解决的问题。我建议使用一种通用的通知接口,比如PropertyChangeListener,或者使用组合模式。 - Hovercraft Full Of Eels
如果你从B中移除B.Observer,并且从A中移除A.Obseserver,这应该可以解决问题。 - ControlAltDel
我不确定你所说的 B.ObserverA.Observer 是什么意思。标准观察者模式只有一个 Observer 接口,由所有观察者实现。 - Chetan Kinger
我需要两个观察者接口。一个用于监测A.a的变化,另一个用于监测B.b的变化。我发现可以在应用程序特定的方式下实现此功能,而无需正式声明观察者接口(例如,A使用B中的方法通知其A.a已更改)。然后,我可以删除“implements”声明并消除编译器错误。所接受的答案中的发布-订阅方法是实现我的目标的一种更通用的方式。 - NLRicker
1个回答

2
使用“发布-订阅模式”,其中每个类既是发布者又是订阅者。publish-subscribe pattern
interface Publisher {
    void addSubscriber(Subscriber sub);
}

interface Subscriber {
    void handle (Object event);
}

class A implements Publisher, Subscriber {...}
class B implements Publisher, Subscriber {...}

如果您不介意使用一些JavaFX技术,那么您应该研究一下属性和绑定,这将允许您做类似于您已经拥有的但这次没有编译器错误的事情。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接