概念html
Observer模式定義對象間的一對多的依賴關係,當一個對象(被觀察者)的狀態發生改變時, 全部依賴於它的對象(觀察者)都獲得通知並被自動更新。JDK裏提供的observer設計模式的實現由java.util.Observable類和 java.util.Observer接口組成。從名字上能夠清楚的看出二者在Observer 設計模式中分別扮演的角色:Observer是觀察者角色,Observable是被觀察目標(subject)角色。java
相關類介紹web
1.Obervable類設計模式
此類表示模型視圖範例中的 observable 對象,繼承它的類表示應用程序想要觀察的對象。一個 observable 對象能夠有一個或多個觀察者。觀察者是實現Observer接口的任意對象。一個 observable 實例改變後,調用 Observable 的 notifyObservers 方法的應用程序會經過調用觀察者的 update 方法來通知觀察者該實例發生了改變。安全
方法摘要框架 |
|
voidide |
addObserver(Observer o) |
protected void性能 |
clearChanged() |
int |
countObservers() |
void |
deleteObserver(Observer o) |
void |
deleteObservers() |
boolean |
hasChanged() |
void |
notifyObservers() 每一個觀察者都有其 update 方法,其調用參數有兩個:observable 對象和 null。換句話說,此方法等效於: notifyObservers(null) |
void |
notifyObservers(Object arg) 每一個觀察者都有其 update 方法,其調用參數有兩個:observable 對象和 arg 參數。 arg 能夠是任意對象 |
protected void |
setChanged() |
關於發送通知的順序
Observable 類中所提供的默認實現將按照其註冊的重要性順序來通知 Observers,可是子類可能改變此順序,從而使用非固定順序在單獨的線程上發送通知,或者也可能保證其子類聽從其所選擇的順序。
注意:此通知機制與線程無關,而且與 Object 類的 wait 和 notify 機制徹底獨立。
新建立一個 observable 對象時,其觀察者集是空的。當且僅當 equals 方法爲兩個觀察者返回 true 時,才認爲它們是相同的。
2.Oberver接口
這是個接口類,這個接口只有一個爲實現的抽象方法update。實現該接口的對象成爲觀察者,該對象要實現update方法。註冊了該對象(觀察者)的對象(觀察者)實例條用notifiyObservers方法後,觀察者會自動執行update方法。
方法摘要 |
|
void |
update(Observable o, Object arg) o - observable 對象。 arg - notifyObservers 方法的參數。 |
實例
該實例模擬了燒水的過程,涉及三個對象,Heater(熱水器),Display(顯示器),Alarm(報警器).
模擬過程:爲了便於運行,水的初始化溫度爲90,沸點爲95,顯示器依據熱水器顯示溫度,顯示器顯示溫度爲95時,報警器開始報警。明顯能夠看出Heater是subject ,Display 是它的 Obsrver,同時Display亦是subject,由於它要被報警器觀察,因此Alarm是Display的Observer.
Heater.java類
public class Heater extends Observable {
private int temperature;
public int getTemperature() {
return temperature;
}
public void setTemperature(int temperature) {
this.temperature = temperature;
}
public void boilWater() {
for (int i = 90; i < 110; i++) {
temperature = i;
this.setChanged();
this.notifyObservers();
}
}
}
Display.java類
public class Display extends Observable implements Observer {
private String status = "未開";
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
@Override
public void update(Observable o, Object arg) {
this.displayTemperature(((Heater) o).getTemperature());
}
private void displayTemperature(int temperature) {
if (temperature > 100) {
this.setStatus("沸騰");
this.setChanged();
this.notifyObservers(temperature);
}
System.out.println("狀態: " + status + " 如今溫度: " + temperature);
}
}
Alarm.java類
public class Alarm implements Observer {
@Override
public void update(Observable arg0, Object arg1) {
this.makeAlarm((Integer) arg1);
}
private void makeAlarm(int temperature) {
System.out.println("嘀嘀嘀。。。水已經燒開了");
// System.out.println("如今水溫是: " + temperature);
}
}
TestMain.java測試入口類
public class TestMain {
public static void main(String[] args) {
Heater heater = new Heater();
Display display = new Display();
Alarm alarm = new Alarm();
heater.addObserver(display);
display.addObserver(alarm);
heater.boilWater();
}
}
優勢
缺點
參考文章:
http://baike.baidu.com/view/6547055.htm
http://msdn.microsoft.com/zh-cn/library/ms978753.aspx