Java中內置的觀察者模式html
Observer對象是觀察者,Observable對象是被觀察者。java
官網api文檔:http://docs.oracle.com/javaapi
http://docs.oracle.com/javase/7/docs/api/java/util/Observable.htmloracle
Observable類用於建立能夠觀測到你的程序中其餘部分的子類。當這種子類的對象發生變化時,觀測類被通知。ide
觀測類必須實現定義了update()方法的Observer接口。code
當一個觀測程序被通知到一個被觀測對象的改變時,update()方法被調用。server
顯然,Observable是一個抽象的主題對象。htm
一個被觀測的對象必須服從下面的兩個簡單規則:對象
第一,若是它被改變了,它必須調用setChanged()方法。繼承
第二,當它準備通知觀測程序它的改變時,它必須調用notifyObservers()方法,這致使了在觀測對象中對update()方法的調用。
注意:若是在調用notifyObservers()方法以前沒有調用setChanged()方法,就不會有什麼動做發生。
notifyObservers()方法中包含clearChanged()方法,將標誌變量置回原值。
notifyObservers()方法採用的是從後向前的遍歷方式,即最後加入的觀察者最早被調用update()方法。
java.util.Observer
http://docs.oracle.com/javase/7/docs/api/java/util/Observer.html
此接口中只有一個方法:
void update(Observable o, Object arg)
這個方法在被觀察對象(Observable類)的notifyObservers()方法中被調用。
package cn.evchar.test; 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) { 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); } }
對象之間鬆耦合,對象內部高內聚
Observable 是一個類,致使不能多繼承,此時根據本身業務判斷是否知足本身的要求。或者能夠本身實現