我正在尝试为我的项目实现观察者模式。 LeaveFields
类扩展了Observable
,LeaveGenerator
实现了Observer
。
private class LeaveFields extends Observable {
private User user;
private Date date;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
setChanged();
notifyObservers(user);
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
setChanged();
notifyObservers(date);
}
}
private class LeaveGenerator implements Observer {
@Override
public void update(Observable observable, Object object) {
if (object instanceof User) {
System.out.println("==============User============");
} else if (object instanceof Date) {
System.out.println("==============Date============");
}
}
}
我所做的是,在执行过程中,对用户或日期的任何更改都会迫使LeaveGenerator
做一些工作。日期更改由以下代码段进行:leaveFields.setDate(date);
。我试图理解为所做的任何更改转移控制的过程。到目前为止,我在执行leaveFields.setDate(date);
后发现正在进行一些更改,控件转移到观察者的update
方法。
//some code
leaveFields.setDate(date);
// code segments following this line wait until the update method of observer returns.
在update
方法完成其任务后,控件返回。 <{1}}正在运行时,当前执行暂停。
我是对的,这是我的问题吗?起初我认为update
是以不同的方式制作的。
答案 0 :(得分:2)
我认为你正在使用java.util.Observable
。
是的,单个执行线程将进入notifyObservers
并回调每个已注册的Observer
。如果要异步通知观察者(因此对notifyObservers()
的调用在每次调用之前都不会阻塞),您需要为此明确编写代码。作为参考,这里是来自java.util.Observable
的相关来源:
private boolean changed = false;
private Vector obs = new Vector();
public void notifyObservers() {notifyObservers(null);}
public void notifyObservers(Object paramObject){
Object[] arrayOfObject;
synchronized (this){
if (!(this.changed))
return;
arrayOfObject = this.obs.toArray();
clearChanged();
}
for (int i = arrayOfObject.length - 1; i >= 0; --i)
((Observer)arrayOfObject[i]).update(this, paramObject);
}