1. 程式人生 > >設計模式: 自己手動實現一個觀察者設計模式

設計模式: 自己手動實現一個觀察者設計模式

package rgs name gree 觀察者設計模式 forecast server 它的 upd

觀察者模式: 定義了對象之間的一對多依賴,這樣一來。當一個對象(被觀察者)改變狀態時,它的全部依賴者(觀察者)都會收到通知並自己主動更新。

在觀察者模式中,會改變的是主題的狀態,以及觀察者的數目和類型。

用這個模式, 你能夠改變依賴主題狀態的對象。卻不必改變主題。這叫提前規劃。

主題和觀察者都使用接口:觀察者利用主題的接口向主題註冊。而主題利用觀察者的接口通知觀察者。這樣能夠讓兩者之間運作正常,有同一時候具有松耦合的長處。

觀察者模式利用“組合”將很多觀察者組合進主題中。對象之間的這樣的關系不是通過繼承產生的,而是在執行時利用組合的方式而產生的。


以下來看觀察者設計模式的一個完整Demo


package observer;
/**
 * 被觀察者接口
 * @author Arvon
 *
 */
public interface Subject {
	public void registerObserver(Observer o);
	public void removeObserver(Observer o);
	public void notifyObservers();
}

package observer;
/**
 * 觀察者接口
 * @author Administrator
 *
 */
public interface Observer {
	public void update(float temp,float humidity, float pressure);
}


package observer;
/**
 * 布告板接口
 * @author Administrator
 *
 */
public interface DisplayElement {
	public void display();

}

package observer;

import java.util.ArrayList;
import java.util.List;

/**
 * 被觀察者的實現類 
 * 主題
 * @author Administrator
 *
 */
public class WeatherData implements Subject {
	private List<Observer> observersList;
	private float pressure;
	private float humidity;
	private float temp;
	
	
	
	public WeatherData() {
		super();
		observersList = new ArrayList<Observer>();
	}

	@Override
	public void registerObserver(Observer o) {
		observersList.add(o);
	}

	@Override
	public void removeObserver(Observer o) {
		int i = observersList.indexOf(o);
		if(i>=0)
			observersList.remove(i);
	}

	@Override
	public void notifyObservers() {
		for (Observer observer : observersList) {
			observer.update(temp, humidity, pressure);
		}
	}
	
	public void setMeasurements(float temp, float humidity, float pressure){
		this.temp = temp;
		this.humidity = humidity;
		this.pressure = pressure;
		messurementsChanged();
	}
	/**
	 * 當新的天氣數據送來時。通知觀察者
	 */
	private void messurementsChanged() {
		// TODO Auto-generated method stub
		notifyObservers();
	}
	
}

package observer;
/**
 * 眼下天氣狀況 布告板
 * @author Administrator
 *
 */
public class CurrentConditionsDisplay implements Observer, DisplayElement {
	private float pressure;
	private float humidity;
	private float temp;
	private WeatherData weatherData;
	
	
	public CurrentConditionsDisplay(WeatherData weatherData) {
		super();
		this.weatherData =weatherData;
		weatherData.registerObserver(this);
	}

	@Override
	public void display() {
		System.out.println("Current conditions:" + temp + "F Degrees and "
				+ humidity + "% humidity");
	}

	@Override
	public void update(float temp, float humidity, float pressure) {
		this.temp = temp;
		this.humidity = humidity;
		this.pressure = pressure;
		display();
		
	}
	
}

package observer;
/**
 * 氣候統計
 * @author Administrator
 *
 */
public class StatisticsDisplay implements DisplayElement, Observer {

	@Override
	public void update(float temp, float humidity, float pressure) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void display() {
		// TODO Auto-generated method stub
		
	}

}

package observer;
/**
 * 天氣預報
 * @author Administrator
 *
 */
public class ForecastDisplay implements DisplayElement, Observer {

	@Override
	public void update(float temp, float humidity, float pressure) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void display() {
		// TODO Auto-generated method stub
		
	}


	
}


package observer;
/**
 * 測試類
 * @author Administrator
 *
 */
public class WeatherStation {

	public static void main(String[] args) {
		WeatherData weatherData = new WeatherData();
		CurrentConditionsDisplay cDisplay  = new CurrentConditionsDisplay(weatherData);
		weatherData.setMeasurements(80.0f, 65, 30.4f);
	}

}

程序的輸出 : Current conditions:80.0F Degrees and 65.0% humidity


設計模式: 自己手動實現一個觀察者設計模式