設計模式: 自己手動實現一個觀察者設計模式
阿新 • • 發佈:2017-06-26
package rgs name gree 觀察者設計模式 forecast server 它的 upd
程序的輸出 : Current conditions:80.0F Degrees and 65.0% humidity
觀察者模式: 定義了對象之間的一對多依賴,這樣一來。當一個對象(被觀察者)改變狀態時,它的全部依賴者(觀察者)都會收到通知並自己主動更新。
在觀察者模式中,會改變的是主題的狀態,以及觀察者的數目和類型。
用這個模式, 你能夠改變依賴主題狀態的對象。卻不必改變主題。這叫提前規劃。
主題和觀察者都使用接口:觀察者利用主題的接口向主題註冊。而主題利用觀察者的接口通知觀察者。這樣能夠讓兩者之間運作正常,有同一時候具有松耦合的長處。
觀察者模式利用“組合”將很多觀察者組合進主題中。對象之間的這樣的關系不是通過繼承產生的,而是在執行時利用組合的方式而產生的。
以下來看觀察者設計模式的一個完整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
設計模式: 自己手動實現一個觀察者設計模式