Java中內置的觀察者模式
Observable類
java.util.Observable
http://docs.oracle.com/javase/7/docs/api/java/util/Observable.html
Observable類用於創建可以觀測到你的程序中其他部分的子類。當這種子類的對象發生變化時,觀測類被通知。
觀測類必須實現定義了update()方法的Observer接口。
當一個觀測程序被通知到一個被觀測對象的改變時,update()方法被調用。
顯然,Observable是一個抽象的主題對象。
一個被觀測的對象必須服從下面的兩個簡單規則:
第一,如果它被改變了,它必須調用setChanged()方法。
第二,當它准備通知觀測程序它的改變時,它必須調用notifyObservers()方法,這導致了在觀測對象中對update()方法的調用。
注意:如果在調用notifyObservers()方法之前沒有調用setChanged()方法,就不會有什么動作發生。
notifyObservers()方法中包含clearChanged()方法,將標志變量置回原值。
notifyObservers()方法采用的是從后向前的遍歷方式,即最后加入的觀察者最先被調用update()方法。
Observer接口
java.util.Observer
http://docs.oracle.com/javase/7/docs/api/java/util/Observer.html
此接口中只有一個方法:
void update(Observable o, Object arg)
這個方法在被觀察對象(Observable類)的notifyObservers()方法中被調用。
程序例子
定義一個主題對象進行倒數計數,數字每次改變時,它的觀察者收到這個數字。
一個觀察者每次收到通知后打印出數字,另一個觀察者在數字小於等於5時才開始打印。
package com.learnjava.observer; import java.util.Observable; import java.util.Observer; class WatchedCounter extends Observable { public void countdown(int number) { for (; number >= 0; --number) { // 設置改變變量 setChanged(); // 通知所有觀察者,將number作為參數信息傳遞給觀察者 notifyObservers(number); } } } class Watcher1 implements Observer { @Override public void update(Observable arg0, Object arg1) { System.out.println("Watcher1's number: " + arg1); } } class Watcher2 implements Observer { @Override public void update(Observable arg0, Object arg1) { if (((Integer) arg1).intValue() <= 5) { System.out.println("Watcher2's number: " + arg1); } } } public class ObserverTest { public static void main(String[] args) { WatchedCounter watchedCounter = new WatchedCounter(); Watcher1 watcher1 = new Watcher1(); Watcher2 watcher2 = new Watcher2(); //添加觀察者 watchedCounter.addObserver(watcher1); watchedCounter.addObserver(watcher2); //開始倒數計數 watchedCounter.countdown(10); } }
參考資料
張龍老師Java SE系列視頻教程。
本博客中關於觀察者模式的文章:
Java讀書筆記12 事件處理基礎 Observer設計模式:
http://www.cnblogs.com/mengdd/archive/2012/09/08/2676587.html
《Head First設計模式》 讀書筆記02 觀察者模式 Observer:
http://www.cnblogs.com/mengdd/archive/2013/01/03/2843298.html
Java 事件模型基礎:監聽器、事件、事件源、事件注冊:
http://www.cnblogs.com/mengdd/archive/2013/02/06/2908241.html
觀察者模式及Java實現例子:
http://www.cnblogs.com/mengdd/archive/2013/02/07/2908929.html