Использование шаблона наблюдателя для объектов, которые не знают друг о друге напрямую

Вот мои интерфейсы Observer и Observable

public interface Observable<T> {
    void addObserver(Observer<T> o);
    void removeObserver(Observer<T> o);
    void removeAllObservers();
    void notifyObservers();
}


public interface Observer<T> {
    public void update(Observable<T> o);
}

Это работает, если у меня есть два класса, которые знают друг о друге, однако, как мне справиться с ситуацией, как показано ниже.

  • RootComposite (создает список слов)
  • WordListComposite (Creates a Word)
    • WordDialog

Теперь, если RootCompoiste нужно знать об изменениях в WordListComposite, я могу реализовать это следующим образом:

public class RootComposite extends Composite implements Observer<WordListComposite > {

public RootComposite() {

WordListComposite wl = new WordListComposite();
wl.addObserver(this);

}

...

@Override
public void update(WordListComposite o) {
    this.lblMessage = o.getMessage();
}

...
}

Это будет работать так, как ожидалось.

Но как RootComposite получает обновления от WordDialog?

Каков наилучший подход в этом случае?


person jax    schedule 26.11.2010    source источник


Ответы (1)


WordListComposite также может реализовать интерфейс Observer, а WordDialog — интерфейс Observable. WordListComposite может наблюдать за WordDialog и, когда он получает уведомление от WordDialog, запускает уведомление для RootComposite (который наблюдает за WordListComposite). По сути, у вас есть экшн-огонь, а затем вы просто отправляете уведомления вверх по дереву.

person Jeremy Raymond    schedule 26.11.2010
comment
Я устал от этого предложения, но получил ошибку о реализации двух универсальных наблюдателей, я открыл здесь новый поток stackoverflow.com/questions/4282437/ - person jax; 26.11.2010
comment
Является ли WordDialog дочерним элементом WordListComposite или также дочерним элементом RootComposite? В вашем описании похоже, что WordDialog является дочерним элементом WordListComposite. Таким образом, WordDialog может уведомить WordListComposite, который затем уведомит RootComposite. - person Jeremy Raymond; 26.11.2010