重看了一遍《JAVA2 教程(第五版)》, 這本書是屬於大而全的類型的, 所以很多重要的東西都有提到, 但是就是不夠詳細, 以至於一些重要的知識點容易被人忽略掉. 廢話不多說了.
Observer 觀察者, 介面, 一個 update 方法
Observable 被觀察者, 類
Observer 介面樣本如下:
public interface Observer {
void update(Observable o, Object arg); //第二個參數類似於附件一樣的功能
}
Observable 類提供的關鍵方法:
public synchronized void addObserver(Observer o); //添加一個觀察者觀察自己;
//這個方法改變被觀察者的狀態. 如果沒有改變被觀察者的狀態, 即使執行 notifyObservers 方法, 觀察者是不會執行任何操作的;
//如果被觀察者狀態改變, 並且執行 notifyObservers 方法, 被觀察者的狀態將會恢複.
//由於是 protected 的方法, 如果想公開調用, 就必須在子類覆蓋 setChanged 方法, 並且改為 public.
protected synchronized void setChanged();
//被觀察者狀態改變後, 使用下面的兩個方法其中的一個, 如果要傳遞資訊給觀察者, 就用第二個, 如果不用, 就用第一個.
//Object arg 會傳到 Observer 對象 的 update(Observable o, Object arg) 方法的第二個參數.
//其實就是 Observable 的 changed 標誌為 true. 則最後兩個方法可以調用所有 Observer 的 update() 方法.
public void notifyObservers();
public void notifyObservers(Object arg);
其實用觀察者和被觀察者來說明他們兩者的關係, 我覺得不是很合適呢, 因為, 在整個過程中, 被觀察者始終是主動的一方呢, 而相對地, 觀察者確實被動的一方, 隨時都可以給被觀察者拋棄. 是不是很奇怪呢, 你會主動找人來監視自己嗎?
在程式中, 往往都是
一個 Observeable 對象對應多個 Observer 對象, 1:N.
Observeable 對象才是主動方, 因為是 Observeable 對象主動 add Observer 對象的, 並且提示他們可以一個一個(順序) 執行 update() 方法.
其實就是一個對象對另外一批的對象的函數調用, 但是使用這個模式可以減少中間的一些代碼, 減少耦合度.