专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »Java教程 » 文档视图:视图与文档(Observer与Observable) »正文

文档视图:视图与文档(Observer与Observable)

来源: 发布时间:星期三, 2008年9月10日 浏览:110次 评论:0
文档\\视图结构的概念是数据与它表示的形式截然分开。不管有多少种表示数据的方法,展示数据的过程都决不能直接影响数据。代表数据的对象??文档不包含任何显示数据的方法的定义或控制。文档与视图的关系是多对多。一个文档可能有多个活动的视图,同时,一个视图对象也可能将多个源文档的数据整合在一起显示。
JAVA提供了在类之间建立文档\\视图关系的机制,其中视图类负责控制全部的处理过程。文档类的唯一责任是提供功能以支持视图类,并在文档对象的数据发生改变而视图对象又应该知道这一改变时执行通知操作,发信号给视图类。
视图类实现了java.util.Observer接口。这个方法有一个方法update(),当连接到该视图的文档类通知他的数据发生改变时调用该方法。视图类就应该从文档对象中读取必要的数据,并相应的更新数据显示。
文档类是java.util.Observable的子类。Observable类提供公用方法以支持Observer对象。其中的两个方法对Observable子类特别重要。第一个方法是setChanged(),设置一个内部的标志位以注明数据发生改变。第而个方法是notifyObservers(),通过调用连接的Observer对象的update()方法通知它放生的改变。Observer对象使用Observable类的addObserver()方法把自己添加到一个列表中。该列表告诉notifyObservers()方法,当改变放生时需要通知哪些Observer对象。这个列表是私有的,所以Observable子类对象无法知道哪些Observer对象正在“观察”。
Observable对象??文档并不负责把Observer对象(视图)添加到内部列表中,尽管是Observable类拥有那个列表。Observer对象负责确保它自己在那个列表中。Observable子类既提供了让Observer对象把自己加到列表中的能力,也保证在需要时通知Observer对象所发生的改变。Observable子类的责任也就那么多了。通过这个机制,任意数目的Observer可以把自己添加到列表中而决不会影响Observable子类的实现,在修改一个应用程序以添加一种新的显示方式时,并不需要修改文档类来支持这种新的显示方式。

让我们看一个例子。这是个非常简单的文档类:

importjava.util.Observable;

publicclassWatchedextendsObservable{
privateintdata=0;

publicintgetData(){
returndata;
}

publicvoidsetData(intdata){
if(this.data!=data){
this.data=data;
setChanged();
}

notifyObservers();
}
}

Watched类包含一个整型变量,可以调用setData()设置或调用getData()读取该变量。重要的是这个类通过在setData()方法中notifyObservers()完成了它对任何Observer对象的责任。调用setChanged()设置一个标志位,表示数据发生改变了。在这个例子中只有当传给setData()的值与已存储的值不一样时,才会设置该标志位。它自动将标志位清零。这个类中没有对视图类的引用,父类Observable负责处理这些细节。
下面是一个监视Watched类的视图对象:

importjava.util.Observer;
importjava.util.Observable;

publicclassWatcherimplementsObserver{
publicWatcher(Watchedw){
w.addObserver(this);
}

publicvoidupdate(Observableo,Objectarg){
System.out.println(\"Datahaschangedto\"+
((Watcher)o).getData());
}
}

Watched对象作为一个参数传给构造函数。构造函数调用Watched对象的addObserver()方法,这注册了Watcher对象,当数据改变时Watcher对象就会收到通知消息。Watched对象作为参数o传给update()方法。
现在我们生成了一个测试程序:

publicclassTestClass{
publicstaticvoidmain(String[]args){
Watcheddoc=newWatched();
Watcherwatch=newWatcher(doc);
doc.setData(1);
doc.setData(2);

相关文章

读者评论

  • 共0条 分0页

发表评论

  • 昵称:
  • 内容: