2010-07-09 125 views
1

我正在嘗試開發一個應用程序,其中如果在PartNumber中有任何更改,人們將會收到通知。它是基於Spring的應用程序。以下是代碼片段。使用Spring依賴注入的觀察者模式實現

我已經在SaveSubscriptionIF中抽象了存儲機制。存儲和檢索的實際細節在這個接口的實現類中。 Spring的實現類將被注入。

外部應用程序調用我的setState()方法 - 傳遞新信息。

store.getObservers()方法返回我Map其中有觀察員和相應的信息來更新。

到目前爲止這麼好。我碰到了store.getObservers()的實現部分。此方法實施需要數據 - 即從外部應用程序傳遞的新信息。

如何將'狀態'數據傳遞給'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(); 
    } 
    } 
+0

@Karthik:Observer接口不是java.lang的。我在這裏創建了自己的界面。 – HanuAthena 2011-07-11 06:13:16

回答

3

我想我明白你的意思。

正常情況下,在觀察者模式中,已更改的值作爲創建的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

將數據傳遞給觀察者是通過觀察者的方法完成的。所以修改你的接口:

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

其實,我只需要getObservers()方法。因爲,在獲取觀察者列表時,我需要做一些過濾 - 比較新值和新值。 update()方法到目前爲止都很好 - 無論需要知道什麼信息,都要通過 - List HanuAthena 2010-07-09 12:45:30