在观察者模式中转移控制

时间:2011-06-18 19:52:55

标签: java observer-pattern

我正在尝试为我的项目实现观察者模式。 LeaveFields类扩展了ObservableLeaveGenerator实现了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是以不同的方式制作的。

1 个答案:

答案 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);
  }