注:Observable和Observer源碼複製於JDK,刪掉了註釋
首先看Observer類,它是一個接口
public interface Observer {
void update(Observable o, Object arg);
}
再看Observable類
public class Observable {
private boolean changed = false;
private Vector obs;
public Observable() {
obs = new Vector();
}
public synchronized void addObserver(Observer o) {
if (o == null)
throw new NullPointerException();
if (!obs.contains(o)) {
obs.addElement(o);
}
}
public synchronized void deleteObserver(Observer o) {
obs.removeElement(o);
}
public void notifyObservers() {
notifyObservers(null);
}
public void notifyObservers(Object arg) {
Object[] arrLocal;
synchronized (this) {
if (!changed)
return;
arrLocal = obs.toArray();
clearChanged();
}
for (int i = arrLocal.length - 1; i >= 0; i--)
((Observer) arrLocal[i]).update(this, arg);
}
public synchronized void deleteObservers() {
obs.removeAllElements();
}
protected synchronized void setChanged() {
changed = true;
}
protected synchronized void clearChanged() {
changed = false;
}
public synchronized boolean hasChanged() {
return changed;
}
public synchronized int countObservers() {
return obs.size();
}
}
它所表達的含義就是當被觀察者所被關心的值發生變化時,通知觀察者,並作出相應的行爲
觀察者類Server,實現Observer觀察者接口
public class Server implements Observer {
public void update(Observable o, Object arg) {
Servable servable = (Servable) o;
System.out.println("servable changed!");
System.out.println(servable.getA());
}
}
被觀察者類Servable,繼承自Observable類,是一個被觀察者
public class Servable extends Observable {
private int a = 4;
public int getA() {
return a;
}
public void setA(int a) {
this.a = a;
setChanged();
notifyObservers();
}
}
現將觀察者添加進被觀察者的列表
Servable servable = new Servable();
Observer server = new Server();
servable.addObserver(server);
當a變化時,首先改變改變狀態將changed變爲true;然後調用notifyObservers方法通知各個觀察者
觀察者們關注於其a的值的變化
測試類Test
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
Servable servable = new Servable();
Observer server = new Server();
servable.addObserver(server);
servable.setA(5);
}
}
當被觀察者servable的A變化時,它通知它所添加的所有觀察者,每一個觀察者按照自己的意願執行自己的update方法
這個例子中,觀察者server執行了打印
運行結果:
servable changed!
5
“好萊塢原則”:不要給我們打電話,我們會給你打電話(don‘t call us, we‘ll call you)。
注:以下爲筆者理解,如有誤請諒解
好萊塢明星都是大牌,請他拍戲的人很多,所以不要打電話來問我有沒有檔期,留下你的電話,有空時我會打電話給你,請他拍戲的人只需要被動等待就可以。
這裏的明星就相當於被觀察者,請他拍戲的人相當於觀察者,觀察者關注他有沒有檔期。觀察者不需要時時去問被觀察者有沒有檔期,有檔期時,明星會setChanged(),改變檔期狀態,並且notifyObservers(),通知關注自己,請自己拍戲的人。請自己拍戲的人再做出相應的動作。