Реализация паттерна Observer с использованием внедрения зависимостей Spring - PullRequest
1 голос
/ 09 июля 2010

Я пытаюсь разработать приложение, в котором люди будут получать уведомления о любых изменениях в PartNumber. Это приложение на основе Spring. Ниже приведен фрагмент кода.

Я абстрагировал механизм хранения здесь, в SaveSubscriptionIF. Фактические детали хранения и извлечения находятся в классе реализации этого интерфейса. Класс реализации будет внедрен Spring.

Внешнее приложение вызывает мой метод setState(), передавая новую информацию.

Метод store.getObservers() возвращает мне Map, у которого есть Наблюдатели и соответствующая информация для обновления.

Пока все хорошо. Я поражен в реализации части store.getObservers(). Для реализации этого метода нужны данные state - т.е. новая информация, переданная из внешнего приложения.

Как передать данные 'state' в класс реализации 'SaveSubscriptionIF' ??

public class PartNumberSubject implements Observable {
     private SaveSubscriptionIF store;
     private Object state;
     @Override
     public void addObserver(final ObserverIF o, final Object subscriptionDetails) {
      store.addObserver(o, subscriptionDetails);
     }
     @Override
     public void notifyObservers() {
      @SuppressWarnings("unchecked")
      final Map<ObserverIF, List<PartInformationVO>> observers =(Map<ObserverIF,List<PartInformationVO>>) store                 .getObservers();
  for (final Entry<ObserverIF, List<PartInformationVO>> observer : observers
                        .entrySet()) {
     observer.getKey().update(observer.getValue());
     }
    }
    @Override
    public void setState(final Object state) {
     this.state = state;
     notifyObservers();
    }
    }

Ответы [ 2 ]

3 голосов
/ 09 июля 2010

Мне кажется, я понимаю, что вы имеете в виду.

Обычно в шаблоне наблюдателя измененное значение передается как параметр в объекте Event, который создается.

Так, например, вы можете создать класс StateChangedEvent, в котором есть значение - состояние.

Тогда ваш метод setState будет выглядеть так:

public void setState(final Object state) {
    this.state = state;
    notifyObservers(state);
}

И notifyObservers:

public void notifyObservers(Object state) {
    StateChangedEvent event = new StateChangedEvent(state);
    // Pass this event into each observer which you have subscribed...
}

Извините, если я неправильно прочитал вопрос, но, похоже, это то, что вы спрашиваете.

2 голосов
/ 09 июля 2010

Передача данных наблюдателям осуществляется с помощью методов наблюдателя.Поэтому измените ваш интерфейс:

public ObserverIF {
    void update(List<PartInformationVO>, Object state);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...