我正在尝试使用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()调用吗?
这是正确的方法,还是有更简单的方法?
答案 0 :(得分:2)
您的Observable需要在任何属性发生变化时调用notifyObservers。
在这个例子中:
mainBean将是Observable complexProperty的Observer。
complexProperty必须在任何状态发生变化时调用notifyObservers。
如果mainBean也是一个Observable,它的update方法(它接收来自complexProperty或任何其他成员Observable的通知)必须调用notifyObservers来将此事件冒泡到结构中。
mainBean不应该负责调用complexProperty.notifyObservers。 complexProperty应该这样做。它应该只调用notifyObservers本身。
答案 1 :(得分:0)
如果您希望MainBean
在ChildBean
上修改属性时作出反应,则 应该让孩子成为Observable
。
您的setSomeProperty(...)
应该在设置属性后通知Observer。