由于在写一个基于Http下载的工具,下载文件的状态的变化可由其来实现,但是对其一无所知,则做个标记!!!
Observable和Observer的事件框架,Observer接口和Observable类可用于Model-View模式中:当Model中的数据发生变化时,
Model主动通知View此变化。其中Model用Observable类来实现,而View可以用实现了Observer接口的类来实现。
在Java中通过Observable类和Observer接口实现了观察者模式。一个Observer对象监视着一个Observable对象的变化,当Observable对象发生变化时,Observer得到通知,就可以进行相应的工作。例如在文档/视图结构中,文档被修改了,视图就会得到通知。
java.util.Observable中有两个方法对Observer特别重要,一个是setChange()方法用来设置一个内部标志位注明数据发生了变化;一个是notifyObservers()方法会去调用一个列表中所有的Observer的update()方法,通知它们数据发生了变化。
Observer通过Observable的addObserver()方法把自己添加到这个列表中。这个列表虽然由Observable拥有,但Observable并不知道到底有哪些Observer正在观察等待通知。Observable只提供一个方法让Observer能把自己添加进列表,并保证会去通知Observer发生了变化。通过这种机制,可以有任意多个Observer对Observable进行观察,而不影响Observable的实现。
Observable类有两个私有变量。一个boolean型的标志位,setChange()将它设为真,只有它为真时,notifyObservers方法才会调用Observer的update方法,clearChange()设标志位为假,hasChange返回当前标志位的值。另一个是一个Vector,保存着一个所有要通知的Observer列表,addObserver添加Observer到列表,deleteObserver从列表中删除指定Observer,deleteObservers清空列表,countObservers返回列表中Observer的数目,在Observer对象销毁前一定要用deleteObserver将其从列表中删除,不然因为还存在对象引用的关系,Observer对象不会被垃圾收集,造成内存泄漏,并且已死的Observer仍会被通知到,有可能造成意料外的错误,而且随着列表越来越大,notifyObservers操作也会越来越慢。
Observable的所有方法都是同步的,保证了在一个线程对其标志位、列表进行操作时,不会有其它线程也在操作它。
Observable的notifyObservers(Object obj)形式可以再调用update时将参数传进去。
通知顺序通常时越晚加入列表的越先通知。update会被依次调用,由于一个update返回后下一个update才被调用。
//被观察者
public class OBservable extends java.util.Observable {
int state = 0;
public int getState() {
return state;
}
public void setState(int state) {
this.setChanged();
this.notifyObservers(state);// 当值改变时通知观察者,调用观察者的update
this.state = state;
}
public static void main(String[] args) {
OBservable horr = new OBservable();
Persons ps = new Persons("工程师A");// 观察者A
Persons ps1 = new Persons("工程师B");// 观察者B
horr.addObserver(ps);// 添加观察
horr.addObserver(ps1);// 添加观察
// 改变被观察者的状态
horr.setState(3);
horr.setState(8);
}
}
//观察者
public class Persons implements java.util.Observer {
String name;
Persons(String name){
this.name=name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void update(java.util.Observable o, Object arg) {
System.out.println(this.name+" 收到通知 " +
"Horrific.state由"+((OBservable)o).getState()+"变为"+arg);
}
}
运行结果:
工程师B 收到通知 Horrific.state由0变为3
工程师A 收到通知 Horrific.state由0变为3
工程师B 收到通知 Horrific.state由3变为8
工程师A 收到通知 Horrific.state由3变为8
在线帮助文档:
http://www.leftworld.net/online/j2sedoc/javaref/java.util.observable_dsc.htm