Observer對象是觀察者,Observable對象是被觀察者。
官網api文檔:http://docs.oracle.com/javase/7/docs/api/
1.
實現觀察者模式
實現觀察者模式非常簡單,
[1]創建被觀察者類,它繼承自java.util.Observable類;
[2]創建觀察者類,它實現java.util.Observer接口;
- 對於被觀察者類:
添加它的觀察者:
void addObserver(Observer o)
addObserver()方法把觀察者對象添加到觀察者對象列表中
當被觀察者中的事件發生變化時,執行
當被觀察者中的事件發生變化時,執行
setChanged();
notifyObservers();
setChange()方法用來設置一個內部標志位注明數據發生了變化;notifyObservers()方法會去調用觀察者對象列表中所有的Observer的update()方法,通知它們數據發生了變化。
只有在setChange()被調用后,notifyObservers()才會去調用update()。
- 對於觀察者類,實現Observer接口的唯一方法update
void update(Observable o, Object arg)
形參Object arg,對應一個由notifyObservers(Object arg);傳遞來的參數,當執行的是notifyObservers();時,arg為null。
- 實例:
被觀察者:ServerManager
package com.test.observer; import java.util.Observable; public class ServerManager extends Observable { private int data = 0; public int getData(){ return data; } public void setData(int i){ if(this.data != i){ this.data = i;setChanged();} notifyObservers(); //只有在setChange()被調用后,notifyObservers()才會去調用update(),否則什么都不干。 } } } }
觀察者一:AObserver
import java.util.Observable; import java.util.Observer; public class AObserver implements Observer { public AObserver(ServerManager sm) { super(); // TODO Auto-generated constructor stub sm.addObserver(this); //注冊加入觀察者 } @Override public void update(Observable arg0, Object arg1) { System.out.println("AObserver receive:Data has changed to "+((ServerManager) arg0).getData()); } }
觀察者二:BObserver
import java.util.Observable; import java.util.Observer; public class BObserver implements Observer { public BObserver(ServerManager sm) { super(); sm.addObserver(this); //注冊加入觀察者 } @Override public void update(Observable o, Object arg) { // TODO Auto-generated method stub System.out.println("BObserver receive:Data has changed to "+((ServerManager) o).getData()); } }
測試:
public class TestDemo { public static void main(String[] args) { // TODO Auto-generated method stub ServerManager sm = new ServerManager(); AObserver a = new AObserver(sm); BObserver b = new BObserver(sm); sm.setData(5); sm.deleteObserver(a); //注銷觀察者,以后被觀察者有數據變化就不再通知這個已注銷的觀察者 sm.setData(10); } }
運行結果: