设计模式之观察者模式
一、什么事观察者模式
如:有A,B连个独立的对象,其中B想时时知道A中的变化,以便做出相应的相应或对策。这就是观察者模式
A为被观察者,B为观察者。 A、B同时均可以为被观察者。
观察者和被观察者N:N的关系。
二、观察者模式的应用
(1)周期性任务。比如win7下的定时关机命令shutdown -s -t 1200(1200秒后关机)。这些命令当预期系统时间到后,就可以通知相应的观察者激活相应的命令。
(2)重新加载配置文件。比如好多大型系统的配置文件,都会在每次修改之后自动重新加载。
三、使用Java类实现观察者模式
java.util.Observable
-able一般可能...的单词后缀,Observable是可以被观察的,程序中的被观察者类,需要继承这个类。
java.util.Observer
这个是观察者,interface。程序中的观察者类,需要实现这个接口中的uupdate()方法。
四、观察者模式实现
1、被观察者,同时也是观察者; 继承Observable称为被观察者,
package com.ssk.Observable; import java.util.Observable; import java.util.Observer; //被观察者 public class NumObservable extends Observable implements Observer{ int data = 0; public void setData(int data){ this.data = data; setChanged();//Marks this <tt>Observable</tt> object as having been changed; notifyObservers();//通知所有观察者 }
@Override public void update(Observable o, Object arg) { System.out.println("观察者和被观察者互相被观察!!"); } }
2、观察者同时也是被观察者
package com.ssk.Observable; import java.util.Observable; import java.util.Observer; //观察者 public class NumObserver extends Observable implements Observer { @Override public void update(Observable o, Object arg) {//有被观察者发生改变,自动调用对应观察者的的update方法 NumObservable numObservable = (NumObservable) o; System.out.println("被观察者Numobservable已改变,data:" + numObservable.data); setChanged(); notifyObservers(); } }
3、进行单元测试
package com.ssk.Observable; import org.junit.Test; public class NumServableTest { @Test public void test(){ NumObservable numOable = new NumObservable(); NumObserver numObserver = new NumObserver(); numOable.addObserver(numObserver);//被观察者绑定观察者 numObserver.addObserver(numOable);//被观察者绑定观察者 numOable.setData(1); numOable.setData(2); numOable.setData(3); } }