【问题标题】:Transfer of control in Observer pattern观察者模式中的控制转移
【发布时间】:2011-06-18 19:52:55
【问题描述】:

我正在尝试为我的项目实现观察者模式。 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 做一些工作。迄今为止的更改是由一些代码 sn-p 进行的,例如: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 方法完成其任务后,控件返回。在update 工作时,当前执行会暂时暂停。

我是对的,这是我的问题吗?起初我以为update 是在不同的线程中制作的。

【问题讨论】:

    标签: java observer-pattern


    【解决方案1】:

    我猜你正在使用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);
      }
    

    【讨论】:

    • 谢谢。是的,我正在使用java.util.Observable。不,我需要同步单线程执行,因为这是合适的。
    猜你喜欢
    • 1970-01-01
    • 2016-02-20
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 2013-02-12
    • 2014-10-14
    • 1970-01-01
    • 2013-04-11
    相关资源
    最近更新 更多