標籤:set http out 繼承 lang 參數 bsp add doc
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); }}
運行結果:
一、java內建的觀察者模式