設計模式(2)_JAVA內置觀察者模式
服務站 需繼承java.util.observable(註冊,取消,通知)
觀察者 需實現java.util.observer(更新)
1.服務站(weatherData)
package Java內置觀察者模式_氣象站大屏展示.Subject.subjectIns.觀察者模式_氣象站大屏展示.Subject.subjectIns; import java.util.Observable; public class weatherDataSub extends Observable { /////////////氣象觀察站功能 //數據變化,實時通知觀察者 public void setData(float mTemparature,float mPressure,float mHimidity){ weatherData weatherData = new weatherData(mTemparature,mPressure,mHimidity); this.setChanged();//設置是否通知,可以用於對是否通知的控制 this.notifyObservers(weatherData);//將通知消息發送給觀察者 this.notifyObservers();//只通知,不發送通知消息 } public class weatherData{ public float mTemparature,mPressure,mHimidity;//溫度//氣壓//溼度 public weatherData(float mTemparature, float mPressure, float mHimidity) { this.mTemparature = mTemparature; this.mPressure = mPressure; this.mHimidity = mHimidity; } } }
2.觀察者
--1.當日氣象大屏(todayCondition)
package Java內置觀察者模式_氣象站大屏展示.Subject.subjectIns.觀察者模式_氣象站大屏展示.Observe.observerIns; import Java內置觀察者模式_氣象站大屏展示.Subject.subjectIns.觀察者模式_氣象站大屏展示.Subject.subjectIns.weatherDataSub; import java.util.Observable; import java.util.Observer; /** * 使用Java內置觀察者Observer */ public class todayCondition implements Observer { ////////////////////////////////////////// /** * //展示通知消息(控制檯打印輸出) * @param notification */ public void display(Object notification){ weatherDataSub.weatherData weatherData = (weatherDataSub.weatherData) notification; System.out.println("*****************最新通知****************************"); System.out.println("****today溫度:"+weatherData.mTemparature+"*********"); System.out.println("****today氣壓:"+weatherData.mPressure+"*********"); System.out.println("****today溼度:"+weatherData.mHimidity+"*********"); System.out.println("**************************************************"); } /** * 更新通知 * @param o * @param arg */ @Override public void update(Observable o, Object arg) { this.display(arg);//展示通知消息(控制檯打印輸出) } }
--2.明日氣象大屏(tomorrowCondition)
package Java內置觀察者模式_氣象站大屏展示.Subject.subjectIns.觀察者模式_氣象站大屏展示.Observe.observerIns; import Java內置觀察者模式_氣象站大屏展示.Subject.subjectIns.觀察者模式_氣象站大屏展示.Subject.subjectIns.weatherDataSub; import java.util.Observable; import java.util.Observer; /** * 使用Java內置觀察者Observer */ public class tomorrowCondition implements Observer { ////////////////////////////////////////// /** * //展示通知消息(控制檯打印輸出) * @param notification */ public void display(Object notification){ weatherDataSub.weatherData weatherData = (weatherDataSub.weatherData) notification; System.out.println("*****************最新通知****************************"); System.out.println("****tomorrow溫度:"+(++weatherData.mTemparature)+"*********"); System.out.println("****tomorrow氣壓:"+(++weatherData.mPressure)+"*********"); System.out.println("****tomorrow溼度:"+(++weatherData.mHimidity)+"*********"); System.out.println("*******************************************************"); } /** * 更新通知 * @param o * @param arg */ @Override public void update(Observable o, Object arg) { this.display(arg);//展示通知消息(控制檯打印輸出) } }
3.Test
package Java內置觀察者模式_氣象站大屏展示.Subject.subjectIns.觀察者模式_氣象站大屏展示; import Java內置觀察者模式_氣象站大屏展示.Subject.subjectIns.觀察者模式_氣象站大屏展示.Observe.observerIns.todayCondition; import Java內置觀察者模式_氣象站大屏展示.Subject.subjectIns.觀察者模式_氣象站大屏展示.Observe.observerIns.tomorrowCondition; import Java內置觀察者模式_氣象站大屏展示.Subject.subjectIns.觀察者模式_氣象站大屏展示.Subject.subjectIns.weatherDataSub; import org.junit.Test; /** * Java內置觀察者模式測試 */ public class test { @Test public void test01() { //初始化 weatherDataSub weatherDataSub= new weatherDataSub();//氣象服務站 todayCondition todayCondition = new todayCondition();//觀察者1 tomorrowCondition tomorrowCondition = new tomorrowCondition();//觀察者2 //註冊觀察者 weatherDataSub.addObserver(todayCondition); weatherDataSub.addObserver(tomorrowCondition); //氣象服務站數據更新 weatherDataSub.setData(30,60,110); //移除觀察者2 weatherDataSub.deleteObserver(tomorrowCondition); System.out.println("觀察者2取消註冊!"); //氣象服務站數據更新 weatherDataSub.setData(60,120,210); } }