设计模式(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); } }