为复杂属性实现Java Observer模式的最佳方法

时间:2012-08-03 22:45:23

标签: java observer-pattern

我正在尝试使用JDK Observer / Observable实现Observer模式,但是我很难看到在包含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的观察者。但是,这意味着我需要在ChildBean上显式调用notifyObservers,如下所示:

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

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

这是正确的方法,还是有更简单的方法?

2 个答案:

答案 0 :(得分:2)

您的Observable需要在任何属性发生变化时调用notifyObservers。

在这个例子中:

mainBean将是Observable complexProperty的Observer。

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

如果mainBean也是一个Observable,它的update方法(它接收来自complexProperty或任何其他成员Observable的通知)必须调用notifyObservers来将此事件冒泡到结构中。

mainBean不应该负责调用complexProperty.notifyObservers。 complexProperty应该这样做。它应该只调用notifyObservers本身。

答案 1 :(得分:0)

如果您希望MainBeanChildBean上修改属性时作出反应,则 应该让孩子成为Observable

您的setSomeProperty(...)应该在设置属性后通知Observer。