Weather_Station.ppt_第1页
Weather_Station.ppt_第2页
Weather_Station.ppt_第3页
Weather_Station.ppt_第4页
Weather_Station.ppt_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Weather-O-Rama Weather Station,Weather-O-Rama气象站信息发布系统,软件学院 辛国栋,Weather-O-Rama Weather Station,问题,在日常生活中,常常会用这样的情形:当某件事发生时,应该通知所有的相关者。 例如,如果我们的课程改变时间或地点,就应该通知所有选修了这门课程的同学。 在软件设计中,也有类似的问题:当一个对象的状态发生变化时,如何能够通知与其相关的所有其他对象,而不用修改该对象的代码?,Weather-O-Rama Weather Station,New mission:,恭喜贵公司获选为敝公司建设下一代Internet

2、气象观察站!改气象站必须建议在我们专利申请中的WeatherData对象上,由WeatherData对象负责追踪目前的天气情况(温度、湿度、气压)。我们希望贵公司能建立一个应用,有三种布告板,分别显示目前的状况、气象统计及简单的预报。当WeatherData获得最新的测量数据时,三种布告板必须实时更新。 而且我们希望这是一个可扩展的气象站,Weather-O-Rama气象站希望公布一组API,好让其他的开发人员写出自己的气象布告板,并插入此应用中,希望贵公司提供这样的API Weather-O-Rama气象站有很好的商业运行模式:一旦客户上钩,他们使用布告板都要付钱。为了感谢贵公司建立此系统,

3、我们将以公司的股份作为支付。,Weather-O-Rama Weather Station,需求分析:-甲方提供的内容,Weather-O-Rama提供的内容 提供WeatherData对象,该对象能够获取目前的天气情况 温度 湿度 气压 也就是说,气象站已经实现了如何获取温度、湿度和气压的方法。,Weather-O-Rama Weather Station,需求分析:-乙方的工作及要求,需要乙方建立一个应用,有三种布告板 目前状况(温度,湿度,气压值显示)的布告 气象统计(如平均温度,平均湿度、最高温度等) 简单预报(短时间内的天气预报) 要求 三个布告板必须在WeatherData对象获取

4、新数据后立刻更新三个公布板。 该应用应该支持扩展,乙方应该提供API,以便其他的程序员写出自己的布告板,并插入到该系统中。 相关的设计和文档随应用程序一并交付。,Weather-O-Rama Weather Station,需求分析:-乙方的回报,气象站(甲方)的运营方式 客户订阅气象站服务,客户订阅每个布告板都需要付钱。 乙方完成任务后得到的回报 股权支付方式,Weather-O-Rama Weather Station,气象发布系统概况,湿度传感器,温度传感器,气压传感器,气象站,WeatherData object,天气预报: 明天下刀子,请预备铁锅!,Weather-O-Rama提供的

5、部分,我们要实现的部分,抽取数据,显示报告,显示设备 有三种显示报告,Weather-O-Rama Weather Station,Weather-O-Rama提供的WeatherData.java,/* 当气象测量数据改变时 调用该方法 */ Public void measurementsChanged() /在此编写你的代码 ,我们的任务就是实现measurementsChanged(),让他更新当前天气、天气统计、天气预报三种报告,Weather-O-Rama Weather Station,我们到现在为止知道些什么?,WeatherData类定义了获得温度、湿度和气压的方法。 只要有

6、新的气象数据measurementsChanged()方法就会被调用 我们需要使用气象数据来提供三种报告,并且,每当WeatherData有新的数据时这三种报告就要更新。 我们要开发的系统必须是可扩展的。 其他开发者可以建立定制的报告,用户可以随意增减他们需要的报告。目前,我们只知道三种报告类型:当前天气情况、气象统计报告、天气预报。,Weather-O-Rama Weather Station,Public class WeatherData /声明实例变量 Public void measurementsChanged() float temp=getTemperature(); floa

7、t humidity = getHumidity(); float pressure=getPressure(); currentConditionDisplay.update(temp,humidity,pressure); statisticsDisplay.update(temp,humidity,pressure); forecastDisplay.update(temp,humidity,pressure); /其他方法 ,获得最新的气象数据,调用每个报告对象,更新显示,因为气象数据发生变化时measurementsChanged()会自动被执行,所以,我们自然会想到下面的解决方案,

8、Weather-O-Rama Weather Station,Public class WeatherData /声明实例变量 Public void measurementsChanged() float temp=getTemperature(); float humidity = getHumidity(); float pressure=getPressure(); currentConditionDisplay.update(temp,humidity,pressure); statisticsDisplay.update(temp,humidity,pressure); forec

9、astDisplay.update(temp,humidity,pressure); /其他方法 ,是针对实现编程还是针对接口编程? 每增加一个新的报告我们都必须修改代码吗? 在运行时我们能动态增加或取消某类报告吗?,这个解决方案好吗?,Weather-O-Rama Weather Station,Public class WeatherData /声明示例变量 Public void measurementsChanged() float temp=getTemperature(); float humidity = getHumidity(); float pressure=getPres

10、sure(); currentConditionDisplay.update(temp,humidity,pressure); statisticsDisplay.update(temp,humidity,pressure); forecastDisplay.update(temp,humidity,pressure); /其他方法 ,由于是对具体实现的编程,所以不修改程序我们无法增加或删除报告,我们的问题在那里?,Weather-O-Rama Weather Station,从生活中获得灵感,出版商,订阅者,A,B,C,D,E,E,A,B,C,D,2,3,1,4,新报纸刊出,1:N,Weat

11、her-O-Rama Weather Station,OO jargon,在面向对象的语言中 出版商=Subject(主题) 订阅者observer(观察者),Weather-O-Rama Weather Station,Public class WeatherData /声明示例变量 Public void measurementsChanged() float temp=getTemperature(); float humidity = getHumidity(); float pressure=getPressure(); currentConditionDisplay.update(

12、temp,humidity,pressure); statisticsDisplay.update(temp,humidity,pressure); forecastDisplay.update(temp,humidity,pressure); /其他方法 ,由于是对具体实现的编程,所以不修改程序我们无法增加或删除报告,我们的问题在那里?,Weather-O-Rama Weather Station,Weather-O-Rama实现思路,/各个公告板获得更新 currentConditionDisplay.update(temp,humidity,pressure); statisticsDi

13、splay.update(temp,humidity,pressure); forecastDisplay.update(temp,humidity,pressure);,是针对实现编程还是针对接口编程? 调用具体的显示设备进行更新,是针对具体编程,这样一旦有了新的公告板需要更改上面的代码,因此需要对上面进行改进。 一种方法是将各种公告板共同特征提取出来,形成一个超类,具体的公告板从超类继承下来。子类从超类继承方法。 另外一种方法是抽象出一个公共的接口,实现update功能。 讨论那种实现方法更好一点? 各个公告板都应该有自己的显示方式,因此应该有一个display()方法,参考Simuduc

14、k的例子,设计成接口,Weather-O-Rama Weather Station,Weather-O-Rama实现思路,Weather-O-Rama Weather Station,Weather-O-Rama实现思路,/ Observer.java public interface Observer public void update(float temp, float humidity, float pressure); / DisplayElement .java public interface DisplayElement public void display(); ,Weat

15、her-O-Rama Weather Station,Weather-O-Rama实现思路,针对接口编程,而不是针对具体编程,这样要求我们对WeatherData类进行抽象,形成一个接口。 因为WeatherData是“出版商”,因此需要 应该有添加用户的方法 应该有删除用户的方法 因为更新部分放到了用户,因此应该有通知用户读取新数据的方法。,Weather-O-Rama Weather Station,Weather-O-Rama实现思路,WeatherData除了接口中的方法之外,另外还有Weather-O-Rama气象站提供给我们的温度湿度和压力的获取方法,以及measurementCh

16、anged方法。这是气象站提供的方法,可以在此方法中调用notifyOberver方法,实现通知用户更新的目的。,Weather-O-Rama Weather Station,Weather-O-Rama实现思路,Weather-O-Rama Weather Station,Weather-O-Rama实现思路,出版商,订阅者,A,B,C,D,E,E,A,B,C,D,2,3,1,4,新报纸刊出,1:N,Weather-O-Rama Weather Station,Weather-O-Rama实现思路,根据生活中的经验,用户定报纸应该向出版商定。 出版商应该有客户名单,即客户的信息,一般按期把信

17、息给客户送过来。 因此客户和出版商直接应该有关系 面向对象的语言应该是关联。 出版商应该拥有每个客户的信息,记录在名单上。也就是说应该包含每个客户的对象。 客户应该有出版商的信息,以便选择服务与否。,Weather-O-Rama Weather Station,Weather-O-Rama实现思路,发布信息,订阅与否,?,Weather-O-Rama Weather Station,Weather-O-Rama实现思路,Weather-O-Rama Weather Station,高质量设计的原则-松耦合(loose Coupling),如果两个对象是松耦合的,则他们可以相互作用,但彼此的依赖

18、性很小。 观察者模式符合松耦合的原则。因为: 主题(subject)只需要知道其观察者(Observer)实现了某个接口。 可以随时加入观察者。 不需要修改主题就可以加入新的类型的观察者 主题和观察者都可以独立地被复用 修改主题或观察者都不会影响另一方。 观察者之间互不相干。,Weather-O-Rama Weather Station,接口:,/ Subject.java public interface Subject public void registerObserver(Observer o); public void removeObserver(Observer o); publ

19、ic void notifyObservers(); / Observer.java public interface Observer public void update(float temp, float humidity, float pressure); / DisplayElement .java public interface DisplayElement public void display(); ,Weather-O-Rama Weather Station,WeatherData.java,/ WeatherData.java import java.util.Arra

20、yList; public class WeatherData implements Subject private ArrayList observers; private float temperature; private float humidity; private float pressure; public WeatherData() /构造方法 observers = new ArrayList(); / 下页还有,Weather-O-Rama Weather Station,WeatherData.java,/续WeatherData.java public void reg

21、isterObserver(Observer o) observers.add(o); public void removeObserver(Observer o) int i = observers.indexOf(o); if (i = 0) observers.remove(i); ,Weather-O-Rama Weather Station,WeatherData.java,/续WeatherData.java /对所用的observer进行更新 public void notifyObservers() for (int i = 0; i observers.size(); i+)

22、 Observer observer = (Observer)observers.get(i); observer.update(temperature, humidity, pressure); ,Weather-O-Rama Weather Station,编写代码,/续WeatherData.java public void measurementsChanged() notifyObservers(); public void setMeasurements(float temperature, float humidity, float pressure) this.temperat

23、ure = temperature; this.humidity = humidity; this.pressure = pressure; measurementsChanged(); / other WeatherData methods here ,Weather-O-Rama Weather Station,CurrentConditionsDisplay,public class CurrentConditionsDisplay implements Observer, DisplayElement private float temperature; private float h

24、umidity; private Subject weatherData; public CurrentConditionsDisplay(Subject weatherData) this.weatherData = weatherData; weatherData.registerObserver(this);/将自己注册到weatherData对象 public void update(float temperature, float humidity, float pressure) this.temperature = temperature; this.humidity = hum

25、idity; display(); public void display() System.out.println(当前天气情况:气温 + temperature + 华氏度,湿度: + humidity + % ); ,Weather-O-Rama Weather Station,WeatherStation客户端即主类,public class WeatherStation public static void main(String args) WeatherData weatherData = new WeatherData(); /将三个布告板传递给weatherData对象 Cu

26、rrentConditionsDisplay currentDisplay = new CurrentConditionsDisplay(weatherData); StatisticsDisplay statisticsDisplay = new StatisticsDisplay(weatherData); ForecastDisplay forecastDisplay = new ForecastDisplay(weatherData); /模拟新的数据的到来 weatherData.setMeasurements(80, 65, 30.4f); weatherData.setMeasu

27、rements(82, 70, 29.2f); weatherData.setMeasurements(78, 90, 29.2f); ,Weather-O-Rama Weather Station,思考与讨论:怎样加入第三方的报告,如果你是第三方,你要知道哪些信息才能编写你的第三方报告?,Weather-O-Rama Weather Station,加入炎热指数报告,public class HeatIndexDisplay implements Observer, DisplayElement float heatIndex = 0.0f; private Subject weatherD

28、ata; public HeatIndexDisplay(Subject weatherData) this.weatherData = weatherData; weatherData.registerObserver(this); public void update(float t, float rh, float pressure) heatIndex = computeHeatIndex(t, rh); display(); private float computeHeatIndex(float t, float rh) float index = 炎热指数计算公式; return index; public void display() System.out.println(炎热指数(Heat index)为: + heatIndex); ,Weather-O-Rama Weather Station,讨论:可不可以合并Observer和DisplayElement,observers,subject,Weather-O-Rama Weather Station,讨论:具体报告类直接与WeatherData关联会怎么

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论