Передача контроля в шаблоне Observer - PullRequest
0 голосов
/ 18 июня 2011

Я пытаюсь реализовать шаблон наблюдателя для моего проекта.Класс 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 завершает свою задачу, управление возвращается.Текущее выполнение временно приостанавливается, пока работает update.

Я прав, и это мой вопрос?Сначала я подумал, что update сделан в другой теме.

1 Ответ

2 голосов
/ 18 июня 2011

Полагаю, вы используете 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);
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...