第二章-面向对象分析课件.ppt

上传人(卖家):晟晟文业 文档编号:5064267 上传时间:2023-02-07 格式:PPT 页数:32 大小:329KB
下载 相关 举报
第二章-面向对象分析课件.ppt_第1页
第1页 / 共32页
第二章-面向对象分析课件.ppt_第2页
第2页 / 共32页
第二章-面向对象分析课件.ppt_第3页
第3页 / 共32页
第二章-面向对象分析课件.ppt_第4页
第4页 / 共32页
第二章-面向对象分析课件.ppt_第5页
第5页 / 共32页
点击查看更多>>
资源描述

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 设置设置实现以下的函

21、数实现以下的函数:u 返回加热托盘传感器的状态返回加热托盘传感器的状态,该传感器检查咖啡壶否该传感器检查咖啡壶否 在托盘上在托盘上,其中是否有咖啡其中是否有咖啡.u 返回烧水壶开关的状态返回烧水壶开关的状态,检查壶中的存水是水多于检查壶中的存水是水多于1/2杯杯u检查开关烧水壶中的加热托盘检查开关烧水壶中的加热托盘u检查开关保温托盘中的加热托盘检查开关保温托盘中的加热托盘u检查开关指示灯检查开关指示灯u开关压力阀门开关压力阀门,阀门关阀门关,烧水壶蒸气压力迫使开水流过烧水壶蒸气压力迫使开水流过 过滤器过滤器16public int getBrewButtonStatus();public st

22、atic final int BREW_BUTTON_PUSHED=0;public static final int BREW_BUTTON_NOT_PUSHED=1u 检查加热按钮的状态检查加热按钮的状态u M4UserInterface.javaM4UserInterface.java public class M4UserInterface public class M4UserInterface extendsextends UserInterface UserInterface private void checkButton()private void checkButton()

23、int buttonStatus=int buttonStatus=CoffeeMakerAPI.api.CoffeeMakerAPI.api.getBrewButtonStatusgetBrewButtonStatus()();if(buttonStatus=if(buttonStatus=CoffeeMakerAPI.BREW_BUTTON_PUSHED CoffeeMakerAPI.BREW_BUTTON_PUSHED)startBrewingstartBrewing();();17n UserInterface.javaUserInterface.java public class p

24、ublic class UserInterfaceUserInterface private HotWaterSource hws private HotWaterSource hws;private ContainmentVessel cv private ContainmentVessel cv;public void done()public void done()public void complete()public void complete()protected void protected void startBrewingstartBrewing()()if(if(hws.i

25、sReady()&cvhws.isReady()&cv.isReadyisReady()()hws.starthws.start();();cv.start cv.start();();18图图 4-10 实现实现1sReady()1sReady()函数函数User Interface#startBrewingHot Water Source+isReady()Containment Vessel+isReady()M4Containment Vessel+isReady()加热水加热水检查检查停止停止/开始开始加热加热M4HotWater Source M4UserInterface+che

26、ckButton()n实现准备就绪实现准备就绪IsReadyIsReady()()函数函数保温器保温器通过调用通过调用coffeeMakerAPIcoffeeMakerAPI函数来实现函数来实现19M4HotWaterSource.javapublic class M4HotWaterSource extends HotWaterSource public boolean isReady()int boiler Status=CoffeeMakerAPI.api.getBoilerStatus();return boilerStatus=CoffeeMakerAPI.BOILER_NOT_EM

27、PTY;20M4ContainmentVessel.javapublic class M4ContainmentVessel extends ContainmentVessel public boolean isReady()int plateStatus=CoffeeMakerAPI.api.getWarmerplateStatus();return plateStatus=CoffeeMakerAPI.POT_EMPTY;21 实现实现 start()start()函数函数nstart()start()函数是类函数是类HotWaterSourceHotWaterSource的一个抽象的一个

28、抽象 方法方法,n是由是由M4UserInterfaceM4UserInterface调用关闭阀门和打开烧调用关闭阀门和打开烧 水壶的水壶的CoffeeMakerAPICoffeeMakerAPI函数实现的。函数实现的。22M4HotWaterSource.javapublic class M4HotWaterSource extends HotWaterSource CoffeeMakerAPI api public M4HotWaterSource(CoffeeMakerAPI api)this.api=api;public boolean isReady()inc boilerStatu

29、s=api.getBoilerStatus();return boilerStatus=api.BOILER_NOT_EMPTY;public void start()api.setReliefValveState(api.VALVE_CLOSED);api.setBoilerState(api.BOILER_ON);23ContainmentVesselContainmentVessel的的start()start()方法唯一操作是方法唯一操作是记住系统煮咖啡的状态。可以保证当咖啡壶放记住系统煮咖啡的状态。可以保证当咖啡壶放到托盘上或将它从托盘上拿走时到托盘上或将它从托盘上拿走时,系统能做出

30、正系统能做出正确的反应。确的反应。M4ContainmentVessel.javaM4ContainmentVessel.javapublic class M4ContainmentVessel extends public class M4ContainmentVessel extends ContainmentVessel ContainmentVessel private CoffeeMakerAPI api private CoffeeMakerAPI api;private boolean isBrewing private boolean isBrewing;public M4Co

31、ntainmentVessel(CoffeeMakerAPI api public M4ContainmentVessel(CoffeeMakerAPI api)this.api=api this.api=api;isBrewing isBrewing=false;=false;24 public boolean isReady public boolean isReady()()int plateStatus=ai.getWarmerPlateStatus int plateStatus=ai.getWarmerPlateStatus();();return plateStatus=api.

32、POT_EMPTY return plateStatus=api.POT_EMPTY;public void start()public void start()isBrewing isBrewing=true;=true;25n M4UserInterface.checkButtonM4UserInterface.checkButton是如何被调用的是如何被调用的?nCoffeeMakerAPI.getBrewButtonStatusCoffeeMakerAPI.getBrewButtonStatus怎样被调怎样被调 用的用的?n即任何检测传感器的方法是如何被调用的即任何检测传感器的方法是如

33、何被调用的?n使用多线程还是使用轮询方法解决使用多线程还是使用轮询方法解决?n一个比较理想的方法是假设这些消息可以异步发一个比较理想的方法是假设这些消息可以异步发 送送,与线程是相互独立的与线程是相互独立的,是后再决定使用多线程是后再决定使用多线程 还是使用轮询。还是使用轮询。n设控制流以异步方式进入设控制流以异步方式进入M4UserInterfaceM4UserInterface对象对象,这样它就调用这样它就调用 CoffeeMakerAPI.getBrewButtonStatusCoffeeMakerAPI.getBrewButtonStatus()()26n假设假设,最小的最小的JVM,

34、JVM,不支持线程不支持线程,只能采用轮询。只能采用轮询。Pollable.javaPollable.javapublic interface Pollablepublic interface Pollable public void poll();public void poll();若若M4UserInterfaceM4UserInterface实现了这个接口实现了这个接口,情况如何情况如何?若若main()main()程序陷入了一个死循环程序陷入了一个死循环,不停地调用此不停地调用此 方法方法,情况如何情况如何?n控制流就会持续不断地进入控制流就会持续不断地进入M4UserInterfa

35、ceM4UserInterface 接口接口,可以检测可以检测“加热加热”按钮。按钮。27User Interface#startBrewingHot Water Source+isReady()Containment Vessel+isReady()M4Containment Vessel加热水加热水检查检查停止停止/开始开始加热加热M4HotWater Source M4UserInterface+checkButton()可以轮询的咖啡机可以轮询的咖啡机interface Pollable +poll()图图 4-11 可以轮询可以轮询 的咖啡机的咖啡机28nCoffeeMaker.ja

36、vapublic class CoffeeMakerpublic class CoffeeMaker public static void main(String args public static void main(String args)CoffeeMakerAPI api CoffeeMakerAPI api=new M4CoffeeMakerAPIImplementation();new M4CoffeeMakerAPIImplementation();M4UserInterface ui M4UserInterface ui=new M4UserInterface(api);ne

37、w M4UserInterface(api);M4HotWaterSource hws M4HotWaterSource hws=new M4HotWaterSource(api);new M4HotWaterSource(api);M4ContainmentVessel cv M4ContainmentVessel cv=new M4ContainmentVessel(api);new M4ContainmentVessel(api);29 ui.init(hws,cvui.init(hws,cv););hws.init(ui,cv hws.init(ui,cv););cv.init(ui,

38、hws cv.init(ui,hws););while(true while(true)ui.poll ui.poll();();hws.poll hws.poll();();cv.poll cv.poll();();可以清楚可以清楚M4UserInterfaceM4UserInterface函数是如函数是如何被调用的。这个函数不是何被调用的。这个函数不是checkButtoncheckButton(),(),而是而是poll()poll()。30M4UserInterface.javapublic class M4UserInterface extendspublic class M4Use

39、rInterface extends UserInterface implement Pollable UserInterface implement Pollable private CoffeeMakerAPI api private CoffeeMakerAPI api;private HotWaterSource hws private HotWaterSource hws;private ContainmentVessel cv private ContainmentVessel cv;public void init(HotWaterSource hws public void i

40、nit(HotWaterSource hws,ContainmentVessel cv ContainmentVessel cv)this.hws=hws this.hws=hws;this.cv=cv this.cv=cv;31 publicpublic M4UserInterface(M4UserInterface(CoffeeMakerAPI apiCoffeeMakerAPI api)this.api=api this.api=api;private void poll()private void poll()int buttonStatus int buttonStatus=api.

41、getBrewButtonStatus api.getBrewButtonStatus();();if(buttonStatus=api.BREW_BUTTON_PUSH if(buttonStatus=api.BREW_BUTTON_PUSH)startBrewing startBrewing();();32评价一下下面的设计评价一下下面的设计图图 4-12 咖啡机的组件咖啡机的组件User InterfaceHot Water SourceContainment VesselM4Containment Vesselinterface PollableM4HotWater M4UserInterface+checkButton()这个结构特点这个结构特点:抽象同细节隔离抽象同细节隔离(圈内的依赖关系都是指向内部圈内的依赖关系都是指向内部的的,线条内的类都不依赖于外部线条内的类都不依赖于外部)这些抽象类并不了解按钮、指示灯、阀门、传感器、这些抽象类并不了解按钮、指示灯、阀门、传感器、咖啡机的其他具体细节咖啡机的其他具体细节,由派生类体现细节。由派生类体现细节。可以重用这三个类来开发不同种类的咖啡机。可以重用这三个类来开发不同种类的咖啡机。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 办公、行业 > 各类PPT课件(模板)
版权提示 | 免责声明

1,本文(第二章-面向对象分析课件.ppt)为本站会员(晟晟文业)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|