体会 Observable与Observer 模式

由于在写一个基于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

你可能感兴趣的:(框架,String,object,vector,Class,文档)