4

我正在尝试使用 JDK Observer/Observable 实现观察者模式,但是我正在努力寻找在包含 bean 作为属性的 bean 上使用它的最佳方法。让我给你一个具体的例子:

我需要观察更改(在它的任何属性中)的主要 bean 是..

public class MainBean extends Observable {
    private String simpleProperty;
    private ChildBean complexProperty;
    ...
    public void setSimpleProperty {
        this.simpleProperty = simpleProperty;
        setChanged()
    }
}

..但是,当我想为其中的任何内容设置新值时,ChildBean它不会触发 MainBean 中的任何更改:

...
mainBean.getComplexProperty().setSomeProperty("new value");
...

我认为更明显的解决方案是也制作ChildBean一个 Observable,MainBean并将ChildBean. 但是,这意味着我需要在 上显式调用 notifyObservers ChildBean,如下所示:

...
mainBean.getComplexProperty().setSomeProperty("new value");
mainBean.getComplexProperty().notifyObservers();
mainBean.notifyObservers();
...

我什至应该在 mainBean 上调用 notifyObservers() 吗?或者是否应该对 complexProperty 级联调用并触发 mainBean 中的 notifyObservers() 调用?

这是执行此操作的正确方法,还是有更简单的方法?

4

2 回答 2

2

你的 Observables 需要在它们的任何属性发生变化时调用 notifyObservers。

在这个例子中:

mainBean 将是 Observable complexProperty 的 Observer。

complexProperty 必须在任何状态发生变化时调用 notifyObservers 。

如果 mainBean 也是一个 Observable,它的更新方法(它从 complexProperty 或任何其他成员 Observable 接收通知)将不得不调用 notifyObservers 以将此事件冒泡到结构中。

mainBean 不应该负责调用 complexProperty.notifyObservers。complexProperty 应该这样做。它应该只对自己调用 notifyObservers。

于 2012-08-03T22:58:06.660 回答
0

如果您希望您在修改您的MainBean属性时做出反应,您应该将孩子设为. ChildBeanObservable

然后,您setSomeProperty(...)应该在设置属性后 notifyObservers 。

于 2012-08-03T22:56:36.393 回答