簡介:使用JAVA內置的幫你搞定觀察者模式。
1. 先把類圖放在這裏:
(1). Observable類追蹤所有的觀察者,並通知他們。
(2). Observer這個接口看起來很熟悉,它和我們之前寫的類幾乎一樣。
(3). WeatherData這就是我們以前所稱的“主題”Subject,從今以後也可以改稱爲“可觀察者”,我們不需要在提供Register(),remove(),notifyObservers()方法。因爲我們已經從超類繼承了這些行爲。
2. 如何把對象編程觀察者
如果以前一樣,實現觀察者接口(java.util.Observer),然後調用任何Observable對象的addObserver()方法,不想在當觀察者時,就調用deleteObserver()方法即可。
3. 可觀察者如何送出通知
首先,你需要利用擴展java.util.Observable接口產生“可觀察者”類,然後,需要兩個步驟:
第一:先調用setChanged()方法,標記狀態已經改變的事實。
第二:然後調用兩種nofityObservers()方法中的一個。
notifyobservers() 或 notifyobservers(Object arg) 當通知時,arg參數爲參數將傳送給美一個觀察者對象。
4. 觀察者如何接收通知
同以前一樣,觀察者實現了更新的方法,但是方法的簽名不太一樣, 如:
update(Observable o, Object arg)
(1). 將主題本身當做一個對象,好讓觀察者知道是哪個主題通知它的。
(2). 第二個參數就是傳入notityObservers()的數據對象,如果沒有說明爲空,如果你想“推”數據給觀察者對象就用該參數,否則觀察者就必須從可觀察者拉數據過來。
5. 代碼實現
(1)WeatherData.java類, 你可以看到它已經實現了Observable類。
package com.chengzhang.subject;
import java.util.Observable;
public class WeatherData extends Observable {
private float temperatrue;
private float humidity;
private float pressure;
public WeatherData(){};
public void measurementsChanged(){
setChanged();
notifyObservers();
}
public float getTemperature(){
return temperatrue;
}
public float getHumidity(){
return humidity;
}
public float getPressure(){
return pressure;
}
// 天氣發生變化
public void setMeasurements(float temperature, float humidity, float pressure){
this.temperatrue = temperature;
this.humidity = humidity;
this.pressure = pressure;
measurementsChanged();
}
}
(2). CurrentConditionsDisplay.java類
package com.chengzhang.subject;
import java.util.Observable;
import java.util.Observer;
public class CurrentConditionsDisplay implements Observer, Display {
private Observable observable;
private float temperature;
private float pressure;
private float humidity;
public CurrentConditionsDisplay(Observable observable){
this.observable = observable;
this.observable.addObserver(this);
}
@Override
public void update(Observable observable, Object obj) {
if(observable instanceof WeatherData){
WeatherData weatherData = (WeatherData)observable;
this.temperature = weatherData.getTemperature();
this.humidity = weatherData.getHumidity();
this.pressure = weatherData.getPressure();
display();
}
}
@Override
public void display() {
System.out.println("當前溫度:" + this.temperature);
System.out.println("當期溼度:" + this.humidity);
System.out.println("當期氣壓:" + this.pressure);
}
}
(3). WeatherStation.java類
package com.chengzhang.subject;
public class WeatherStation {
public static void main(String[] args) {
WeatherData weatherData = new WeatherData();
CurrentConditionsDisplay CurrentConditionsDisplay = new CurrentConditionsDisplay(weatherData);
weatherData.setMeasurements(23, 35, 12);
}
}
(4). 輸出結果
當前溫度:23.0
當期溼度:35.0
當期氣壓:12.0