觀察者模式(Observer Pattern) Java內置 使用方法
本文地址: http://blog.csdn.net/caroline_wendy/article/details/26601659
觀察者模式(observer pattern)詳解, 參見: http://blog.csdn.net/caroline_wendy/article/details/26583157
Java內置的觀察者模式, 是通過繼承父類, 實現觀察者模式的幾個主要函數:
Observerable(可被觀察的): 是一個父類(class),addObserver(), 添加觀察者; deleteObserver(), 刪除觀察者;
notifyObservers(), 通知觀察者;setChanged(), 確認更改;
Observer(觀察者): 是一個接口(interface), update(), 更新觀察者數據;
setChanged()->notifyObservers(), 必須要先使用setChanged(), 再使用notifyObservers(), 即先確認提交, 再通知觀察者;
觀察者的更新接口update(Observerable o, Object arg), 即可以使用推(push), 也可以使用拉(pull);
如果notifyObservers(arg), 傳遞參數, 則爲推(push)的方法, 如果沒有參數, 則爲拉(pull)的方式, 即使用get()方法獲取;
觀察者的通知(notify)順序是先入後出的模式.
Observerable(可被觀察的) 的 代碼:
- /**
- * @time 2014年5月22日
- */
- package observer.java;
- import java.util.Observable;
- /**
- * @author C.L.Wang
- *
- */
- public class WeatherData extends Observable {
- private float temperature;
- private float humidity;
- private float pressure;
- public WeatherData() {}
- public void measurementsChanged() {
- setChanged();
- notifyObservers();
- }
- public void setMeasurements(float temperature, float humidity, float pressure) {
- this.temperature = temperature;
- this.humidity = humidity;
- this.pressure = pressure;
- measurementsChanged();
- }
- public float getTemperature() {
- return temperature;
- }
- public float getHumidity() {
- return humidity;
- }
- public float getPressure() {
- return pressure;
- }
- }
/**
* @time 2014年5月22日
*/
package observer.java;
import java.util.Observable;
/**
* @author C.L.Wang
*
*/
public class WeatherData extends Observable {
private float temperature;
private float humidity;
private float pressure;
public WeatherData() {}
public void measurementsChanged() {
setChanged();
notifyObservers();
}
public void setMeasurements(float temperature, float humidity, float pressure) {
this.temperature = temperature;
this.humidity = humidity;
this.pressure = pressure;
measurementsChanged();
}
public float getTemperature() {
return temperature;
}
public float getHumidity() {
return humidity;
}
public float getPressure() {
return pressure;
}
}
Observer(觀察者)的代碼:
- /**
- * @time 2014年5月22日
- */
- package observer.java;
- import java.util.Observable;
- import java.util.Observer;
- /**
- * @author C.L.Wang
- *
- */
- public class CurrentConditionsDisplay implements Observer, DisplayElement {
- Observable observable;
- private float temperature;
- private float humidity;
- public CurrentConditionsDisplay(Observable observable) {
- this.observable = observable;
- observable.addObserver(this);
- }
- /* (non-Javadoc)
- * @see observer.java.DisplayElement#display()
- */
- @Override
- public void display() {
- // TODO Auto-generated method stub
- System.out.println("Current conditions: " + temperature +
- "F degrees and " + humidity + "% humidity");
- }
- /* (non-Javadoc)
- * @see java.util.Observer#update(java.util.Observable, java.lang.Object)
- */
- @Override
- public void update(Observable o, Object arg) {
- // TODO Auto-generated method stub
- if (o instanceof WeatherData) {
- WeatherData weatherData = (WeatherData)o;
- this.temperature = weatherData.getTemperature();
- this.humidity = weatherData.getHumidity();
- display();
- }
- }
- }
/**
* @time 2014年5月22日
*/
package observer.java;
import java.util.Observable;
import java.util.Observer;
/**
* @author C.L.Wang
*
*/
public class CurrentConditionsDisplay implements Observer, DisplayElement {
Observable observable;
private float temperature;
private float humidity;
public CurrentConditionsDisplay(Observable observable) {
this.observable = observable;
observable.addObserver(this);
}
/* (non-Javadoc)
* @see observer.java.DisplayElement#display()
*/
@Override
public void display() {
// TODO Auto-generated method stub
System.out.println("Current conditions: " + temperature +
"F degrees and " + humidity + "% humidity");
}
/* (non-Javadoc)
* @see java.util.Observer#update(java.util.Observable, java.lang.Object)
*/
@Override
public void update(Observable o, Object arg) {
// TODO Auto-generated method stub
if (o instanceof WeatherData) {
WeatherData weatherData = (WeatherData)o;
this.temperature = weatherData.getTemperature();
this.humidity = weatherData.getHumidity();
display();
}
}
}
其餘代碼不一一列出, 類似參見: http://blog.csdn.net/caroline_wendy/article/details/26583157
測試代碼:
- package observer.java;
- public class WeatherStation {
- public static void main(String[] args) {
- WeatherData weatherData = new WeatherData();
- CurrentConditionsDisplay currentConditions = new CurrentConditionsDisplay(weatherData);
- StatisticsDisplay statisticsDisplay = new StatisticsDisplay(weatherData);
- ForecastDisplay forecastDisplay = new ForecastDisplay(weatherData);
- weatherData.setMeasurements(80, 65, 30.4f);
- weatherData.setMeasurements(82, 70, 29.2f);
- weatherData.setMeasurements(78, 90, 29.2f);
- }
- }
package observer.java;
public class WeatherStation {
public static void main(String[] args) {
WeatherData weatherData = new WeatherData();
CurrentConditionsDisplay currentConditions = new CurrentConditionsDisplay(weatherData);
StatisticsDisplay statisticsDisplay = new StatisticsDisplay(weatherData);
ForecastDisplay forecastDisplay = new ForecastDisplay(weatherData);
weatherData.setMeasurements(80, 65, 30.4f);
weatherData.setMeasurements(82, 70, 29.2f);
weatherData.setMeasurements(78, 90, 29.2f);
}
}
輸出:
- Forecast: Improving weather on the way!
- Avg/Max/Min temperature = 80.0/80.0/80.0
- Current conditions: 80.0F degrees and 65.0% humidity
- Forecast: Watch out for cooler, rainy weather
- Avg/Max/Min temperature = 81.0/82.0/80.0
- Current conditions: 82.0F degrees and 70.0% humidity
- Forecast: More of the same
- Avg/Max/Min temperature = 80.0/82.0/78.0
- Current conditions: 78.0F degrees and 90.0% humidity