設計模式 - 觀察者模式(Observer Pattern) Java內置 使用方法

觀察者模式(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(可被觀察的) 的 代碼:

  1. /** 
  2.  * @time 2014年5月22日 
  3.  */  
  4. package observer.java;  
  5.   
  6. import java.util.Observable;  
  7.   
  8. /** 
  9.  * @author C.L.Wang 
  10.  * 
  11.  */  
  12. public class WeatherData extends Observable {  
  13.     private float temperature;  
  14.     private float humidity;  
  15.     private float pressure;  
  16.       
  17.     public WeatherData() {}  
  18.       
  19.     public void measurementsChanged() {  
  20.         setChanged();  
  21.         notifyObservers();  
  22.     }  
  23.       
  24.     public void setMeasurements(float temperature, float humidity, float pressure) {  
  25.         this.temperature = temperature;  
  26.         this.humidity = humidity;  
  27.         this.pressure = pressure;  
  28.         measurementsChanged();  
  29.     }  
  30.       
  31.     public float getTemperature() {  
  32.         return temperature;  
  33.     }  
  34.       
  35.     public float getHumidity() {  
  36.         return humidity;  
  37.     }  
  38.       
  39.     public float getPressure() {  
  40.         return pressure;  
  41.     }  
  42. }  
/**
 * @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(觀察者)的代碼:

  1. /** 
  2.  * @time 2014年5月22日 
  3.  */  
  4. package observer.java;  
  5.   
  6. import java.util.Observable;  
  7. import java.util.Observer;  
  8.   
  9. /** 
  10.  * @author C.L.Wang 
  11.  * 
  12.  */  
  13. public class CurrentConditionsDisplay implements Observer, DisplayElement {  
  14.   
  15.     Observable observable;  
  16.     private float temperature;  
  17.     private float humidity;  
  18.       
  19.     public CurrentConditionsDisplay(Observable observable) {  
  20.         this.observable = observable;  
  21.         observable.addObserver(this);  
  22.     }  
  23.       
  24.     /* (non-Javadoc) 
  25.      * @see observer.java.DisplayElement#display() 
  26.      */  
  27.     @Override  
  28.     public void display() {  
  29.         // TODO Auto-generated method stub  
  30.         System.out.println("Current conditions: " + temperature +   
  31.                 "F degrees and " + humidity + "% humidity");  
  32.     }  
  33.   
  34.     /* (non-Javadoc) 
  35.      * @see java.util.Observer#update(java.util.Observable, java.lang.Object) 
  36.      */  
  37.     @Override  
  38.     public void update(Observable o, Object arg) {  
  39.         // TODO Auto-generated method stub  
  40.         if (o instanceof WeatherData) {  
  41.             WeatherData weatherData = (WeatherData)o;  
  42.             this.temperature = weatherData.getTemperature();  
  43.             this.humidity = weatherData.getHumidity();  
  44.             display();  
  45.         }  
  46.     }  
  47.   
  48. }  
/**
 * @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


測試代碼:

  1. package observer.java;  
  2.   
  3. public class WeatherStation {  
  4.   
  5.     public static void main(String[] args) {  
  6.         WeatherData weatherData = new WeatherData();  
  7.         CurrentConditionsDisplay currentConditions = new CurrentConditionsDisplay(weatherData);  
  8.         StatisticsDisplay statisticsDisplay = new StatisticsDisplay(weatherData);  
  9.         ForecastDisplay forecastDisplay = new ForecastDisplay(weatherData);  
  10.   
  11.         weatherData.setMeasurements(806530.4f);  
  12.         weatherData.setMeasurements(827029.2f);  
  13.         weatherData.setMeasurements(789029.2f);  
  14.     }  
  15. }  
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);
	}
}

輸出:

  1. Forecast: Improving weather on the way!  
  2. Avg/Max/Min temperature = 80.0/80.0/80.0  
  3. Current conditions: 80.0F degrees and 65.0% humidity  
  4. Forecast: Watch out for cooler, rainy weather  
  5. Avg/Max/Min temperature = 81.0/82.0/80.0  
  6. Current conditions: 82.0F degrees and 70.0% humidity  
  7. Forecast: More of the same  
  8. Avg/Max/Min temperature = 80.0/82.0/78.0  
  9. Current conditions: 78.0F degrees and 90.0% humidity  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章