2012-09-14 125 views
2

我想在使用Observable和Observer的同時更好地理解MVC結構,並試圖通過實現比較文件的程序來實現。我希望我的視圖能夠顯示文件和一些統計數據的列表。如何使用不同的數據更新視圖?MVC - 可以查看觀察對象嗎?

例如,如果統計信息發生變化,我想將統計對象發送到視圖,以便它可以更新它的顯示。但同時,如果文件列表發生變化,我想將ArrayList發送到視圖,以便它可以更新它的顯示。我是否對兩者使用相同的更新方法?如果是這樣,那麼我可以讓我的視圖看看實例是什麼並相應地顯示嗎?

回答

4

MVC如何工作的一個很好的例子是在Swing框架中。每一次狀態改變都會觸發一種事件,而想要了解這些改變的對象實現了聽衆(又名觀察者)。

所以,總的來說,你應該創建一個名爲StatisticsListener一個接口,這樣的:

public interface StatisticsListener { 
    public void statisticsChanged(StatisticsEvent evt); 
} 

與事件StatisticsEvent:

public class StatisticsEvent { 
    private final Statistics changedStatistics; 

    public StatisticsEvent(Statistics changedStatistics){ 
     this.changedStatistics = changedStatistics; 
    } 

    public Statistics getChangedStatistics(){ 
     return this.changedStatistics; 
    } 
} 

...在你的類來處理統計,你點燃事件:

public class ClassThatHandlesStatistics { 
    private final List<StatisticsListener> listeners = new CopyOnWriteArrayList<StatisticsListener>(); 

    public void doSomething(){ 
     Statistics changed ... //do your logic 
     fireStatisticsChanged(new StatisticsEvent(changed)); 
    } 

    protected void fireStatisticsChanged(StatisticsEvent evt){ 
     for (StatisticsListener listener : listeners){ 
      listener.statisticsChanged(evt); 
     } 
    } 
} 

這樣的事情;-)

+1

因此,如果我想要一個名爲FileCompare的模型,我會讓它調用fireStatisticsChanged和fireFileListChanged嗎?然後,無論哪一個相應的觀點碰巧看到一個或另一個將獲得更新提供的視圖實現了監聽器和註冊... yada yada。它是否正確? – Geoff

+0

是的,是的=) –

+0

真棒,謝謝! – Geoff

相關問題