使用Spring依赖注入的Observer模式实现

时间:2010-07-09 12:16:41

标签: java spring dependency-injection observer-pattern

我正在尝试开发一个应用程序,如果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 个答案:

答案 0 :(得分:3)

我想我明白你的意思。

通常在观察者模式中,更改的值将作为创建的Event对象中的参数传递。

因此,例如,你可以创建一个StateChangedEvent类,其中包含一个值 - state。

然后,你的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...
}

如果我误解了这个问题,我很抱歉,但这似乎就是你所要求的。

答案 1 :(得分:2)

通过观察者的方法将数据传递给观察者。所以修改你的界面:

public ObserverIF {
    void update(List<PartInformationVO>, Object state);
}