Java面向对象分析案例
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
还是针对接口编 程?
} //其他方法 }
动态增加或取消 某类报告吗?
8.Weather-O-Rama Weather Station
10
我们的问题在那里?
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); forecastDisplay.update(temp,humidity,pressure); } //其他方法 }
是针对实现编程还是针对接口编程?
调用具体的显示设备进行更新,是针对具体编程,这样一旦有了新 的公告板需要更改上面的代码,因此需要对上面进行改进。 一种方法是将各种公告板共同特征提取出来,形成一个超类,具体 的公告板从超类继承下来。子类从超类继承方法。 另外一种方法是抽象出一个公共的接口,实现update功能。 讨论那种实现方法更好一点?
WeatherData 获得最 新的气 象数据
getTemperature() getHumidity() getPressure() measurementsChanged()
Public void measurementsChanged() { float temp=getTemperature(); float humidity = getHumidity(); float pressure=getPressure(); //other methods currentConditionDisplay.update(temp,humidity,pressure); statisticsDisplay.update(temp,humidity,pressure); forecastDisplay.update(temp,humidity,pressure);
1
New mission:
恭喜贵公司获选为敝公司建设下一代Internet气象观察站!该气
象站必须建议在我们专利申请中的WeatherData对象上,由 WeatherData对象负责追踪目前的天气情况(温度、湿度、气 压)。我们希望贵公司能建立一个应用,有三种布告板,分别显 示目前的状况、气象统计及简单的预报。当WeatherData获得最 新的测量数据时,三种布告板必须实时更新。
问题提出
在日常生活中,常常会用这样的情形:当某件
事发生时,应该通知所有的相关者。
例如,如果我们的课程改变时间或地点,就应该通 知所有选修了这门课程的同学。
在软件设计中,也有类似的问题:当一个对象
的状态发生变化时,如何能够通知与其相关的 所有其他对象,而不用修改该对象的代码?
8.Weather-O-Rama Weather Station
8.Weather-O-Rama Weather Station 18
Weather-O-Rama实现思路
《interface》Subject
各个公告板都应该有自己的显示方式,因此应该有一个display()
方法,参考Simuduck的例子,设计成接口
8.Weather-O-Rama Weather Station
14
实现思路-公告板接口设计
《interface》Observer 《interface》DisplayElement
update()
8.Weather-O-Rama Weather Station 16
实现思路-WeatherData接口设计
针对接口编程,而不是针对具体编程,这样要
求我们对WeatherData类进行抽象,形成一 个接口。 因为WeatherData是“出版商”,因此需要
应该有添加用户的方法 应该有删除用户的方法
WeatherData
getTemperature() getHumidity() getPressure() measurementsChanged()
//other methods
/* 当气象测量数据改变时 调用该方法 */
Public void measurementsChanged(){
//在此编写你的代码
我们的任务就是实现 measurementsChanged(),让他 更新当前天气、天气统计、天气 预报三种报告
8.Weather-O-Rama Weather Station 7
}
我们到现在为止知道些什么?
WeatherData类定义了获得温度、湿度和气压
的方法。 只要有新的气象数据measurementsChanged() 方法就会被调用 我们需要使用气象数据来提供三种报告,并且, 每当WeatherData有新的数据时这三种报告就 要更新。 我们要开发的系统必须是可扩展的。
因为更新部分放到了用户,因此应该有通知用户读 取新数据的方法。
8.Weather-O-Rama Weather Station
17
实现思路-WeatherData接口设计
《interface》Subject
WeatherData除了接口
registerObserver() removeObserver() notifyObserver()
8.Weather-O-Rama Weather Station
4
需求分析:-乙方的回报
气象站(甲方)的运营方式
客户订阅气象站服务,客户订阅每个布告板都需要 付钱。
乙方完成任务后得到的回报 股权支付方式
8.Weather-O-Rama Weather Station
5
气象发布系统概况
WeatherData registerObserver() removeObserver() notifyObserver()
geTemperature() getHumidity() getPressure() measurementsChanged()
中的方法之外,另外还 有Weather-O-Rama气 象站提供给我们的温度 湿度和压力的获取方法, 以及 measurementChanged 方法。这是气象站提供 的方法,可以在此方法 中调用notifyOberver方 法,实现通知用户更新 的目的。
display()
CurrentconditionsDisplay
StatisticsDisplay
ThirdPartyDisplay
update() Display(){ //display current //measurements
update() Display(){ //display average,… //measurements
Public void measurementsChanged() { float temp=getTemperature(); 每增加一个新的 float humidity = getHumidity(); float pressure=getPressure(); 报告我们都必须 currentConditionDisplay.update(temp,humidity,pressure); 修改代码吗? statisticsDisplay.update(temp,humidity,pressure); 在运行时我们能 forecastDisplay.update(temp,humidity,pressure);
12
OO jargon
在面向对象的语言中 出版商=Subject(主题) 订阅者=observer(观察者)
8.Weather-O-Rama Weather Station
13
实现思路-公告板接口设计
//各个公告板获得更新 currentConditionDisplay.update(temp,humidity,pressure); statisticsDisplay.update(temp,humidity,pressure); forecastDisplay.update(temp,humidity,pressure);
显示报告
天气预报: 明天下刀子, 请预备铁锅!
抽取数据 湿度传感器
气象站
温度传感器
WeatherData object
显示设备
气压传感器
有三种显 示报告
Weather-O-Rama提供的部分 我们要实现的部分
8.Weather-O-Rama Weather Station 6
Weather-O-Rama提供的WeatherData.java
其他开发者可以建立定制的报告,用户可以随意增 减他们需要的报告。目前,我们只知道三种报告类 型:当前天气情况、气象统计报告、天气预报。
8.Weather-O-Rama Weather Station 8
我们自然会想到下面的解决方案
Public class WeatherData { //声明实例变量…
看起来我们是需要用一个公用接口来 与现实报告打交道
8.Weather-O-Rama Weather Station
变 化 的 部 分 应 该 加 以 封 装
11
从生活中获得灵感
出版商 4
新报纸刊出 A A B C D E B C D
1:N
订阅者
3 2
E
1
8.Weather-O-Rama Weather Station
而且我们希望这是一个可扩展的气象站,Weather-O-Rama气象
站希望公布一组API,好让其他的开发人员写出自己的气象布告 板,并插入此应用中,希望贵公司提供这样的API
Weather-O-Rama气象站有很好的商业运行模式:一旦客户上钩,
他们使用布告板都要付钱。为了感谢贵公司建立此系统,我们将 以公司的股份作为支付。
8.Weather-O-Rama Weather Station 2
需求分析:-甲方提供的内容
Weather-O-Rama提供的内容 提供WeatherData对象,该对象能够获取目前的天 气情况
• 温度 • 湿度 • 气压
也就是说,气象站已经实现了如何获取温度、湿度 和气压的方法。
8.Weather-O-Rama Weather Station
} //其他方法 }
调用每个报告对 象,更新显示
因为气象数据发 生变化时 measurementsCh anged()会自动被 执行,所以…
9
8.Weather-O-Rama Weather Station
这个解决方案好吗?
Public class WeatherData { //声明实例变量…
是针对实现编程
update() Display(){ //display something //based on measurements
8.Weather-O-Rama We百度文库ther Station
15
实现思路-公告板接口设计
// Observer.java public interface Observer { public void update(float temp, float humidity, float pressure); } // DisplayElement .java public interface DisplayElement{ public void display(); }
3
需求分析:-乙方的工作及要求
需要乙方建立一个应用,有三种布告板 目前状况(温度,湿度,气压值显示)的布告 气象统计(如平均温度,平均湿度、最高温度等) 简单预报(短时间内的天气预报)
要求 三个布告板必须在WeatherData对象获取新数据后 立刻更新。 该应用应该支持扩展,乙方应该提供API,以便其 他的程序员写出自己的布告板,并插入到该系统中。 相关的设计和文档随应用程序一并交付。