MVC - 可以查看观察对象吗?
问题描述:
我想在使用Observable和Observer的同时更好地理解MVC结构,并试图通过实现比较文件的程序来实现。我希望我的视图能够显示文件和一些统计数据的列表。如何使用不同的数据更新视图?MVC - 可以查看观察对象吗?
例如,如果统计信息发生变化,我想将统计对象发送到视图,以便它可以更新它的显示。但同时,如果文件列表发生变化,我想将ArrayList发送到视图,以便它可以更新它的显示。我是否对两者使用相同的更新方法?如果是这样,那么我可以让我的视图看看实例是什么并相应地显示吗?
答
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);
}
}
}
这样的事情;-)
因此,如果我想要一个名为FileCompare的模型,我会让它调用fireStatisticsChanged和fireFileListChanged吗?然后,无论哪一个相应的观点碰巧看到一个或另一个将获得更新提供的视图实现了监听器和注册... yada yada。它是否正确? – Geoff
是的,是的=) –
真棒,谢谢! – Geoff