第二章-面向对象分析课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《第二章-面向对象分析课件.ppt》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第二 面向 对象 分析 课件
- 资源描述:
-
1、1一个设计的启发一个设计的启发:Mark4 Mark4 专用咖啡机专用咖啡机2 描述描述:nMark4Mark4专用咖啡机最多一次可煮好专用咖啡机最多一次可煮好1212杯咖啡。杯咖啡。n使用者向烧水壶使用者向烧水壶(boiler)(boiler)内加入最多内加入最多1212杯冷水杯冷水,按下加热按下加热(Brew)(Brew)键键,水被加热至沸腾水被加热至沸腾,蒸气压力迫使水漫蒸气压力迫使水漫 过咖啡粉末过咖啡粉末,咖啡通过滤网的过滤咖啡通过滤网的过滤,流入咖啡壶中流入咖啡壶中,并保并保 持一定温度。壶中有咖啡时持一定温度。壶中有咖啡时,保温托盘处于工作状态保温托盘处于工作状态,若若 将壶从保
2、温托盘上拿开将壶从保温托盘上拿开,水流将立刻停止水流将立刻停止,这样煮沸的咖这样煮沸的咖 啡不会溢出到保温托盘上。啡不会溢出到保温托盘上。n使用者先将咖啡粉放入滤网使用者先将咖啡粉放入滤网(filter)(filter)内内,滤网放入滤网支架滤网放入滤网支架(filter holder)(filter holder)中中,将滤网支架滑入托盘中将滤网支架滑入托盘中,咖啡壶咖啡壶(pot)(pot)放在保温托盘放在保温托盘(warmer plate(warmer plate上。上。3需要监控的硬件需要监控的硬件n 用于烧水壶的加热部件用于烧水壶的加热部件,可以开启和关闭可以开启和关闭n保温托盘的加
3、热部件保温托盘的加热部件,可以开启和关闭可以开启和关闭n保温托盘的传感器保温托盘的传感器,有三个状态有三个状态:warmerEmpty warmerEmpty(温热装置空闲温热装置空闲)potEmpty potEmpty(壶空壶空),potNotEmpty),potNotEmpty(壶不空壶不空)n烧水壶中的传感器烧水壶中的传感器,有二个状态有二个状态:boilerEmpty,boilerNotEmpty boilerEmpty,boilerNotEmptyn加热键指示加热过程加热键指示加热过程,加热过程结束加热过程结束,咖啡咖啡 煮好煮好,指示灯亮指示灯亮n压力阀门压力阀门,有开启和关闭状态
4、。当开启时有开启和关闭状态。当开启时,烧水烧水 壶中的压力降低壶中的压力降低,使经过过滤网的水流立刻停止。使经过过滤网的水流立刻停止。4n 硬件由硬件工程师提供硬件由硬件工程师提供API实现。实现。n软件如何设计软件如何设计?ButtonLightCoffeeMakerBoilerWarmePlateBoilerSensorSensorPlate SensorHeaterBoilerHeaterPlate Heater烧水壶烧水壶灯亮灯亮咖啡壶咖啡壶保温托盘保温托盘传感器传感器加热器加热器图图 1 过于具体的咖啡机过于具体的咖啡机这个设计如何这个设计如何?5解决思路解决思路#1 向向Light
5、(Light(灯亮灯亮)类添加方法类添加方法,看看怎么样看看怎么样?LightLight只有只有on(),offon(),off()()两个方法两个方法Light.javaLight.javapublic class Light public class Light public void on()public void on()CoffeeMakerAPI.api CoffeeMakerAPI.api.setIndicatorState(CoffeeMakerAPI.INDICATOR_ON setIndicatorState(CoffeeMakerAPI.INDICATOR_ON););/
6、设置指示器状态设置指示器状态 public void off()public void off()CoffeeMakerAPI.api CoffeeMakerAPI.api.setIndicatorState(CoffeeMakerAPI.INDICATOR_OFF setIndicatorState(CoffeeMakerAPI.INDICATOR_OFF););n这段代码有什么问题这段代码有什么问题?n没有变量没有变量,奇怪奇怪,因为对象通常拥因为对象通常拥有状态有状态,且还操纵这些状态且还操纵这些状态n两个方法只是简单调用的一个转两个方法只是简单调用的一个转发者发者,没作任何事情没作任何
7、事情,多余称为泡多余称为泡泡类泡类(Vapor Class)(Vapor Class)nButton,Boiler,WarmerPlateButton,Boiler,WarmerPlate也也是如此是如此6解决思路解决思路#2#2 考虑抽象考虑抽象 图中有两个基类图中有两个基类 Sensor,HeaterSensor,Heatersensor.javasensor.javapublic interface Sensorpublic interface Sensor public int public int sense();sense();Heater.javaHeater.javapubli
8、c interface Heaterpublic interface Heater public void turnOn public void turnOn();();public void turnOff public void turnOff();();程序的这两个类有什么用程序的这两个类有什么用?一个类只包含抽象方法一个类只包含抽象方法,但没有使用者但没有使用者,返回值不确定返回值不确定,sense()sense()方法返回什么方法返回什么?在烧水壶的传感器中返回在烧水壶的传感器中返回值有两种可能值有两种可能.在在保温托盘的传感器中返保温托盘的传感器中返回值有三种可能回值有三种可能.无
9、法在接口中表达传感器无法在接口中表达传感器的约定的约定.Sensor,Heater Sensor,Heater没什么用没什么用.7一个可行的解决方案一个可行的解决方案n 重新根据问题的重新根据问题的本质特性本质特性分解细节分解细节n 忘掉忘掉:烧水壶、阀门、加热托盘、传感器等烧水壶、阀门、加热托盘、传感器等n 专注专注本质本质问题问题:怎样冲咖啡怎样冲咖啡?n 向咖啡粉上倒热水向咖啡粉上倒热水,然后将产生的液体收集到然后将产生的液体收集到 某种容器内。某种容器内。n可设定为两个抽象类可设定为两个抽象类:HotWaterSourceHotWaterSource(烧水壶、阀门、传感器烧水壶、阀门、
10、传感器)加热水加热水,把热水送到咖啡粉把热水送到咖啡粉,最后滴到最后滴到ContainmentVesselContainmentVessel (保温托盘、传感器演了这个角色保温托盘、传感器演了这个角色)容器中容器中,且保温。且保温。8n其描述其描述:HotWaterSourceContainmentVesselCoffeeFlowCoffeeFlow 这个关系是根据物理特性设定的这个关系是根据物理特性设定的,而不是根而不是根据软件操作的控制设定的。据软件操作的控制设定的。HotWaterSourceContainmentVesselstartstart图图 2 2 交叉线交叉线图图 3 3 开
11、启热水水流开启热水水流 设计中的关联是在对象间发送消息的通道设计中的关联是在对象间发送消息的通道,和物理对象的流程无关。和物理对象的流程无关。9n 用户与系统是怎样交互的用户与系统是怎样交互的?用类用类UserInterfaceUserInterface(按钮、指示灯按钮、指示灯)来表示。来表示。n 这三个类实例之间是怎样交互的这三个类实例之间是怎样交互的?#由哪个对象检测用户按下加热由哪个对象检测用户按下加热“Brew”Brew”按钮这一事件按钮这一事件?UserInterfaceUserInterface对象对象#加热按钮被按下时加热按钮被按下时,这个对象应该做什么这个对象应该做什么?确认
12、烧水壶满了确认烧水壶满了,咖啡壶是空的咖啡壶是空的,且放在保温托盘上。且放在保温托盘上。UserInterfaceUserInterface对象发送消息给对象发送消息给:HotWaterSource ContainmentVesselHotWaterSource ContainmentVessel,是否就绪。是否就绪。10UserInterfaceHotWaterSourceContainmentVesselIsReadyIsReadyIsReadyIsReady图图 4 4 加热按钮被按下加热按钮被按下,检查是否就绪检查是否就绪 只要有一个只要有一个查询为查询为false,false,拒绝加
13、热咖啡拒绝加热咖啡,通知用户通知用户,请求请求无效。无效。具体到咖啡机具体到咖啡机上上,可用指示灯闪可用指示灯闪烁来表示。烁来表示。UserInterfaceHotWaterSourceContainmentVessel2a:IsReady2a:IsReady1a:IsReady1a:IsReady图图 5 5 加热按钮被按下加热按钮被按下,完成完成3a:Start3a:Start 两个查询的两个查询的结果都为结果都为true,true,开始热水的流动。开始热水的流动。具体到咖啡机上具体到咖啡机上,关闭阀门关闭阀门,打开烧打开烧水壶。水壶。11UserInterfaceHotWaterSour
14、ceContainmentVessel2a:IsReady2a:IsReady1a:IsReady1a:IsReady图图 6 6 暂停和恢复热水的流动暂停和恢复热水的流动3a:Start3a:Start 煮咖啡时煮咖啡时,咖啡机的用户可以把咖啡壶从加咖啡机的用户可以把咖啡壶从加热托盘上拿走。热托盘上拿走。哪个对象检查壶被拿走哪个对象检查壶被拿走?停止咖停止咖啡的流动。啡的流动。1b:Pause1b:Pause2b:Resume2b:Resume 是是ContainmentVesselContainmentVessel对象对象:咖啡壶被拿走咖啡壶被拿走,停止加热停止加热;咖啡壶被放回原处咖啡壶
15、被放回原处,开始加热开始加热12UserInterfaceHotWaterSourceContainmentVessel2a:IsReady2a:IsReady1a:IsReady1a:IsReady图图 7 7 检查加热的过程是否完成检查加热的过程是否完成(done)(done)3a:Start3a:Start 咖啡煮好咖啡煮好,就停止热水的流动。就停止热水的流动。哪个对象知道哪个对象知道煮咖啡的过程结束了煮咖啡的过程结束了?1b:Pause1b:Pause2b:Resume2b:Resumev 加热完毕加热完毕 User Interface 要知道要知道,咖啡煮好咖啡煮好,亮灯。亮灯。2c
16、:Done2c:Done1c:Done1c:Done2d:Done2d:Done1d:Done1d:Done HotWaterSource要要知道加热过程结束知道加热过程结束,停止热水流动。停止热水流动。对于咖啡机对于咖啡机,关闭烧水壶关闭烧水壶,打开阀门。打开阀门。ContainmentVessel也要也要知道加热过程结束知道加热过程结束,检查空咖检查空咖 啡壶确实放回到保湿托盘上啡壶确实放回到保湿托盘上,并发出用户倒完最后一杯咖并发出用户倒完最后一杯咖 啡的信号。啡的信号。13UserInterfaceHotWaterSourceContainmentVessel2a:IsReady2a:
17、IsReady1a:IsReady1a:IsReady图图 8 8 咖啡倒空咖啡倒空3a:Start3a:Start 加热过程结束后加热过程结束后,咖啡机熄灭指示灯咖啡机熄灭指示灯,空咖啡空咖啡壶放回到托盘上。壶放回到托盘上。谁来检查这种情况谁来检查这种情况?1b:Pause1b:Pause2b:Resume2b:Resumev 咖啡倒空咖啡倒空2c:Done2c:Done1c:Done1c:Done2d:Done2d:Done1d:Done1d:Done ContainmentVesselu检查检查,它还向它还向UserInterface发送一个发送一个Complete(完成完成)消息消息1
18、e:Complete1e:Complete4a:Start4a:Start14如何在这种结构下实现如何在这种结构下实现Mark4Mark4咖啡机咖啡机?是否可实现这三个类中的方法是否可实现这三个类中的方法,去调用相应的去调用相应的CoffeeMakerAPICoffeeMakerAPI?x x是否将咖啡机的本质同是否将咖啡机的本质同Mark4Mark4机绑定在一起就机绑定在一起就可以可以?是个糟糕的设计是个糟糕的设计利用依赖倒置利用依赖倒置(DIP)(DIP)进行设计进行设计User Interface#startBrewingHotWaterSourceContainmentVessel图图
19、 9 9 检查加热按钮检查加热按钮M4UserInterface+checkButton当当checkButtoncheckButton函数被调用函数被调用,它就调用它就调用CoffeeMakerAPI.getBrewButtonStatusCoffeeMakerAPI.getBrewButtonStatus()()按钮己经被按下按钮己经被按下,它就调它就调用用UserInterfaceUserInterface中的保护方法中的保护方法startBrewingstartBrewing()()为什么要创建保护方法为什么要创建保护方法startBrewingstartBrewing()?()?为什
20、么不直接从为什么不直接从M4UserInterfaceM4UserInterface调用调用start()start()函数函数?对对start(),isReadystart(),isReady()()检测方法的调用都是检测方法的调用都是UserInterfaceUserInterface应该处理的高级行为应该处理的高级行为,不应不应耦合到耦合到Mark4Mark4机中。机中。15CoffeeMakerAPI.JAVApublic interface CoffeeMakerAPI public static CoffeeMakerAPI api=null;/由由 main 设置设置实现以下的函
展开阅读全文