《第11章面向对象设计PPT讲稿.ppt》由会员分享,可在线阅读,更多相关《第11章面向对象设计PPT讲稿.ppt(96页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第1111章面向对象设计章面向对象设计第1页,共96页,编辑于2022年,星期一本章目标本章目标?了解面向对象设计的指导原则了解面向对象设计的指导原则?了解系统设计方法了解系统设计方法?掌握类和关联设计的方法掌握类和关联设计的方法?掌握设计优化技术掌握设计优化技术第2页,共96页,编辑于2022年,星期一主要内容主要内容面向对象设计概述面向对象设计的指导原则系统设计对象设计设计优化第3页,共96页,编辑于2022年,星期一内容线索内容线索面向对象设计概述面向对象设计概述面向对象设计的指导原则系统设计对象设计设计优化第4页,共96页,编辑于2022年,星期一面向对象设计面向对象设计OOD(Ob
2、ject-Oriented Design)就是“根据需求决定所需的类、类的操作以及类之间关联的过程”面向对象的编程范式(paradigm)是l决定你要的类;l给每个类提供完整的一组操作;l明确地使用继承来表现共同点。-Bjarne Stroustrup第5页,共96页,编辑于2022年,星期一面向对象设计面向对象设计系统设计确定实现系统的策略目标系统的高层结构对象设计确定解空间中的类、关联、接口形式及实现服务的算法第6页,共96页,编辑于2022年,星期一面向对象设计的步骤面向对象设计的步骤从面向对象分析到面向对象设计,是一个逐渐扩充模型的过程细化重组类细化和实现类间关系,明确其可见性增加属性
3、,指定属性的类型与可见性分配职责,定义执行每个职责的方法对消息驱动的系统,明确消息传递方式利用设计模式进行局部设计画出详细的类图与时序图第7页,共96页,编辑于2022年,星期一好的面向对象设计好的面向对象设计什么是好的面向对象设计“应对变化,提高复用”的设计怎样才能设计“好的面向对象”遵循一定的面向对象设计原则熟悉一些典型的面向对象设计模式第8页,共96页,编辑于2022年,星期一内容线索内容线索面向对象设计的概述面向对象设计的指导原则面向对象设计的指导原则系统设计对象设计设计优化第9页,共96页,编辑于2022年,星期一面向对象设计的准则面向对象设计的准则模块化抽象信息隐藏OOobject
4、sclass+第10页,共96页,编辑于2022年,星期一OO+communicationwithmessagesinheritance面向对象设计的准则面向对象设计的准则弱耦合(1)交互耦合(2)继承耦合强内聚(1)服务内聚(3)一般-特殊内聚(2)类内聚第11页,共96页,编辑于2022年,星期一面向对象设计的准则面向对象设计的准则软件重用的3个层次知识重用方法和标准的重用软件成分的重用代码重用设计结果重用分析结果重用重用重用(再用或复用):是指同一事物不作修改或稍加改动就多次重复使用第12页,共96页,编辑于2022年,星期一类构件类构件“类”是比较理想的可重用软构件重用的含义尽量使用已
5、有的类创建新类时考虑将来的可重复使用性重用方式实例重用继承重用多态重用第13页,共96页,编辑于2022年,星期一启发规则启发规则1.设计结果应该清晰易懂2.一般-特殊结构的深度应适当3.设计简单的类4.使用简单的协议5.使用简单的服务6.把设计变动减至最小第14页,共96页,编辑于2022年,星期一六十一条六十一条OOADOOAD的经验原则的经验原则 你不必严格遵守你不必严格遵守这些原则这些原则,违背它们,违背它们也不会被处以宗教刑罚。但你应当把这也不会被处以宗教刑罚。但你应当把这些原则看成警铃,若违背了其中的一条,些原则看成警铃,若违背了其中的一条,那么警铃就会响起那么警铃就会响起。-OO
6、DOOD启思录启思录,ArthurJ.Riel第15页,共96页,编辑于2022年,星期一类设计原则类设计原则单一职责原则(SRP,SingleResponsibilityPrinciple)一个类应该仅有一个引起它变化的原因开闭原则(OCP,OpenClosedPrinciple)替换原则(LSP,LiskovSubstitutionPrinciple)依赖倒置原则(DIP,DependencyInversionPrinciple)接口分离原则(ISP,InterfaceSegregationPrinciple)第16页,共96页,编辑于2022年,星期一OCPOCP开闭原则开闭原则类模块应
7、该是可扩展的,但是不可修改(对扩展开放,对更改封闭)自动步进式收音机听众收听节目()收音机TumOn()TumOff()FreqUp()FreqDown()VolumeUp()VolumeDown()手动螺旋式收音机第17页,共96页,编辑于2022年,星期一LSPLSP替换原则替换原则子类必须能够替换它们的基类 类C类A类B 操作A()操作B()第18页,共96页,编辑于2022年,星期一DIPDIP依赖倒置原则依赖倒置原则高层模块不应该依赖于低层模块,二者都应该依赖于抽象抽象不应该依赖于实现细节,实现细节应该依赖于抽象 业务实现类A业务实现类B业务实现类C业务实现类D业务接口业务抽象类A子
8、程序类业务抽象类B第19页,共96页,编辑于2022年,星期一ISP接口分离原则接口分离原则不应该强迫客户程序依赖于它们不用的方法第20页,共96页,编辑于2022年,星期一ISP接口分离原则接口分离原则第21页,共96页,编辑于2022年,星期一内容线索内容线索面向对象设计概述面向对象设计的准则和启发规则系统设计系统设计对象设计设计优化第22页,共96页,编辑于2022年,星期一系统设计系统设计系统设计是问题求解及建立解答的高级策略系统的高层结构形式包括子系统的分解它的固有并发性子系统分配给硬软件数据存储管理资源协调软件控制实现人机交互接口第23页,共96页,编辑于2022年,星期一典型的面
9、向对象设计模型典型的面向对象设计模型第24页,共96页,编辑于2022年,星期一示例示例第25页,共96页,编辑于2022年,星期一子系统间的交互方式子系统间的交互方式客户-供应商关系:单向交互平等伙伴关系:双向交互请求contractpeersubsystem请求请求peersubsystemSuppliersubsystemClientsubsystem第26页,共96页,编辑于2022年,星期一组织系统的两种方案组织系统的两种方案(1)层次组织(2)块状组织第27页,共96页,编辑于2022年,星期一课外阅读课外阅读具体该如何设计系统呢?设计问题域子系统设计人机交互子系统设计任务管理子系
10、统设计数据管理子系统第28页,共96页,编辑于2022年,星期一补充知识补充知识:模型模型-视图视图-控制器控制器(MVC)(MVC)Model存储和控制数据提供访问和设置数据的方法通过事件来通知注册了的视图多视图共享一个模型View数据的可视化表示Controller为视图处理事件第29页,共96页,编辑于2022年,星期一示例示例:政治选举信息系统政治选举信息系统政治选举信息系统BlackPurpleBlueGreen1063943VotesDataEntryother2第30页,共96页,编辑于2022年,星期一解决方案(解决方案(SolutionSolution)应用程序分成三个方面:
11、模型封装内核数据和功能视图向用户输出信息,它从模型中获取数据控制器接受输入(用户事件和用户输入的数据):每个视图有一个相关的控制器模型数据的任何变化通过“Publisher-Subscriber”/“Observer”模式立即在相关视图中加以反映第31页,共96页,编辑于2022年,星期一结构(结构(StructureStructure)ModelcoreDatasetOfObserversAttach(Observer)detach(Observer)notifygetDataserviceViewmyModelmyControllerinit(Model)makeControlleract
12、ivatedisplayupdateControllermyModelmyViewInit(Model,View)handleEventupdateObserverupdateCallupdateattachCallserviceattachCallservicemanipulatedisplaycreate第32页,共96页,编辑于2022年,星期一场景说明之一场景说明之一:Model:View:ControllermainprogramInit(:model)attach(:view)makeControllerInit(:model,:view)attach(:controller)第3
13、3页,共96页,编辑于2022年,星期一场景说明之二场景说明之二:用户的输入导致模型数据的改用户的输入导致模型数据的改变变:Controller:Model:ViewnotifyhandleEventserviceupdatedisplaygetDataupdategetData第34页,共96页,编辑于2022年,星期一MVCMVC模式的优点模式的优点同一模型的多视图视图同步化可插入的视图和控制器第35页,共96页,编辑于2022年,星期一MVCMVC的缺点的缺点潜在过多的更新因素变化可能传播到无关的视图和控制器视图和控制器之间的紧密相连一个视图离不开它的控制器视图访问模型数据的低效率如果更
14、新频繁,不必要的对来自模型的未改变数据的请求将降低系统性能。视图和控制器与模型紧密耦合模型接口的改变很可能使视图和控制器的代码无效第36页,共96页,编辑于2022年,星期一内容线索内容线索面向对象设计的准则启发规则软件重用系统设计对象设计对象设计设计类中的服务设计类中的服务设计关联设计关联设计优化第37页,共96页,编辑于2022年,星期一对象设计对象设计设计模型设计模型对象对象数据结构数据结构算法算法消息传递消息传递控制控制分析模型分析模型类类属性属性方法方法关系关系行为行为第38页,共96页,编辑于2022年,星期一确定类中的服务确定类中的服务综合考虑对象模型、动态模型和功能模型,正确确
15、定类中应有的服务对象模型设计的基本框架,通常只在每个类中列出很少几个最核心的服务第39页,共96页,编辑于2022年,星期一ATM现有金额现有金额付出金额付出金额分行代码总行总行总行名总行名1.*现金兑换卡现金兑换卡密码密码输入站输入站柜员终端柜员终端分行分行分行名分行名雇员号卡号柜员事务柜员事务远程事务远程事务柜员柜员姓名姓名站号账号账户账户余额余额限额限额类型类型储户储户姓名姓名地址地址组成组成拥有拥有雇雇佣佣保管保管拥有拥有1.*拥有拥有发放发放输入输入1.*输入输入1.*启动启动1.*修改修改1.*卡权限卡权限密码密码限额限额事务事务日期日期更新更新金额金额类型类型组成组成1.*拥有拥
16、有1.*1.*1.*访访问问标识标识1.*1.*1.*第40页,共96页,编辑于2022年,星期一确定类中的服务确定类中的服务状态图描绘一类对象的生命周期,状态转换是执行对象服务的结果接收消息(事件)的对象必然有由消息选择符指定的服务同样事件不同行为,则实现服务的算法中需要有一个依赖于状态的DO-CASE型控制结构第41页,共96页,编辑于2022年,星期一确定类中的服务确定类中的服务功能模型处理是从输入流中抽取一个值,则该输入流就是目标对象处理具有类型相同的输入流和输出流,而且输出流实质上是输入流的另一种形式,则该输入输出流就是目标对象处理从多个输入流得出输出值,输出流就是目标对象处理把对输
17、入流处理的结果输出给数据存储或动作对象,则该数据存储或动作对象就是目标对象第42页,共96页,编辑于2022年,星期一示例:从事件导出的操作示例:从事件导出的操作“更新账户”“验证卡号”服务通常就是接受事件的对象在相应状态的行为:储户储户:ATM:总行:总行:分行:分行插卡插卡要求密码要求密码输入密码输入密码验证用户验证用户帐户有效帐户有效验证用户验证用户帐户有效帐户有效要求事务类型要求事务类型输入类型输入类型要求输入取款额要求输入取款额输入取款额输入取款额请求处理事务请求处理事务请求处理分行事务请求处理分行事务分行事务成功分行事务成功事务成功事务成功吐出现金吐出现金请求拿走现金请求拿走现金拿
18、走现金拿走现金请求继续此事务请求继续此事务结束结束印账单印账单退卡退卡请求拿走卡请求拿走卡拿走卡拿走卡显示主屏幕显示主屏幕第43页,共96页,编辑于2022年,星期一分行类状态图分行类状态图do/验证卡号请求分行验卡无效do/验证密码有效错正确第44页,共96页,编辑于2022年,星期一数据流图数据流图验证验证密码密码卡信息卡信息显示出显示出错信息错信息密码错密码错选定选定分行分行分分行行代代码码错错分行信息分行信息验卡验卡接收接收输入输入卡卡号号卡权限,正确卡权限,正确密码密码现金现金兑换卡兑换卡分行代码分行代码卡号卡号分行代码分行代码第45页,共96页,编辑于2022年,星期一设计实现服务
19、的方法设计实现服务的方法设计实现服务的算法算法复杂度容易理解与容易实现易修改选择数据结构定义内部类和内部操作第46页,共96页,编辑于2022年,星期一设计关联设计关联1.关联的遍历单向遍历和双向遍历2.实现单向关联第47页,共96页,编辑于2022年,星期一设计关联设计关联3.实现双向关联1,用属性实现一个方向的关联,用属性实现一个方向的关联2,用属性实现两个方向的关联,用属性实现两个方向的关联3,用独立的关联对象实现双向关联,用独立的关联对象实现双向关联第48页,共96页,编辑于2022年,星期一内容线索内容线索面向对象设计的准则启发规则软件重用系统设计对象设计设计优化设计优化第49页,共
20、96页,编辑于2022年,星期一设计优化设计优化1、确定优先级速度、内存、费用、可修改性2、提高效率的几项技术(1)增加冗余关联以提高访问效率(2)调整查询次序(3)保留派生属性冗余数据:通过某种运算而从其他数据派生出来的数据派生属性:用于保存冗余数据第50页,共96页,编辑于2022年,星期一示例示例1 1假设某公司共有2000名雇员,平均每名雇员会10种技能,则简单的嵌套查询将遍历雇员对象2000次,针对每名雇员平均再遍历技能对象10次。如果全公司仅有5名雇员精通日语,则查询命中率仅有1/4000。第51页,共96页,编辑于2022年,星期一增加冗余关联以提高访问效率增加冗余关联以提高访问
21、效率语言语言精通语言精通语言1+1+第52页,共96页,编辑于2022年,星期一调整查询次序调整查询次序优化算法的一个途径是尽量缩小查找范围例如,假设用户在使用上述的雇员技能数例如,假设用户在使用上述的雇员技能数据库的过程中,希望找出既会讲日语又会据库的过程中,希望找出既会讲日语又会讲法语的雇员。如果某公司只有讲法语的雇员。如果某公司只有5位雇员会位雇员会讲日语,会讲法语的雇员却有讲日语,会讲法语的雇员却有200人,则应该人,则应该先查找会讲日语的雇员,然后再从这些会讲日先查找会讲日语的雇员,然后再从这些会讲日语的雇员中查找同时又会讲法语的人。语的雇员中查找同时又会讲法语的人。第53页,共96
22、页,编辑于2022年,星期一设计优化设计优化3、调整继承关系继承关系能够为一个类族定义一个协议,并能在类之间实现代码共享以减少冗余(1)抽象与具体创建具体类归纳通用类派生具体类归纳通用类(2)为提高继承程度而修改类定义不能违背领域知识和常识应该确保现有类的协议(即同外部世界的接口)不变(3)利用委托实现行为共享仅当存在真实的一般-特殊关系(即子类确实是父类的一种特殊形式)时,利用继承机制实现行为共享才是合理的第54页,共96页,编辑于2022年,星期一示例示例2 2抽象与具体抽象与具体肉馅肉馅价钱价钱重量重量肥瘦比例肥瘦比例买买吃吃烹调烹调土豆土豆价钱价钱重量重量买买吃吃烹调烹调削皮削皮食品食
23、品价钱价钱重量重量买买吃吃烹调烹调土豆土豆削皮削皮肉馅肉馅肥瘦比例肥瘦比例五花肉五花肉肥瘦比例肥瘦比例切法切法切肉切肉买买吃吃烹调烹调价钱价钱重量重量第55页,共96页,编辑于2022年,星期一示例示例2 2抽象与具体抽象与具体食品食品价钱价钱重量重量买买吃吃烹调烹调土豆土豆削皮削皮肉肉肥瘦比例肥瘦比例肉馅肉馅五花肉五花肉切法切法切肉切肉第56页,共96页,编辑于2022年,星期一示例示例3 3利用委托实现行为共享利用委托实现行为共享m_List第57页,共96页,编辑于2022年,星期一同步练习同步练习classEyepublic:voidLook(void);classNosepublic
24、:voidSmell(void);classMouthpublic:voidEat(void);classEarpublic:voidListen(void);第58页,共96页,编辑于2022年,星期一同步练习同步练习 class Head:public Eye,public Nose,public Mouth,public Ear ;第59页,共96页,编辑于2022年,星期一答案答案/正确的设计,冗长的程序class Head public:void Look(void)m_eye.Look();void Smell(void)m_nose.Smell();void Eat(void)m
25、_mouth.Eat();void Listen(void)m_ear.Listen();private:Eye m_eye;Nose m_nose;Mouth m_mouth;Ear m_ear;第60页,共96页,编辑于2022年,星期一设计模式设计模式设计模式描述了软件设计过程中某一类常见问题的一般性的解决方案面向对象设计模式描述了面向对象设计过程中、特定场景下、类与相互通信的对象之间常见的组织关系每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心。-Christopher Alexander第61页,共96页,编辑于2022年,星期一设计模式设计模式模式具有:
26、名称(name)描述问题和解决方案的一个或两个单词问题(problem)什么时候应用模式解决方案(solution)描述设计元素、元素间的关系、职责和协作结果和交易(Consequencesandtrade-offs)应用模式返回的结果第62页,共96页,编辑于2022年,星期一设计模式设计模式设计模式:可复用面向对象软件的基础,ErichGamma等编著,机械工业出版社GangofFour(GoF),该书描述了23种经典设计模式GoF23种设计模式Abstract Factory,Adapter,Bridge,Build-er,Chain of Responsibility,Command,
27、Composite,Decorator,Facade,Factory Method,Flyweight,Interpreter,Iterator,Mediator,Memento,Observer,Prototype,Proxy,Singleton,State,Strategy,Template Method,Visitor 第63页,共96页,编辑于2022年,星期一用设计模式优化设计实例用设计模式优化设计实例问题陈述需求分析使用设计模式进行面向对象设计第64页,共96页,编辑于2022年,星期一问题陈述问题陈述设计一个信息系统进行药厂、药店、医生、病人之间的关系管理DrugWareHous
28、es(药厂)DrugStores(药店)Doctors(医生)Patients(病人)第65页,共96页,编辑于2022年,星期一DrugWareHouseDrugWareHouse药厂药厂-DrugStore-DrugStore药店药店药厂药店药店从药厂获取药品药店从药厂获取每件药品的价格第66页,共96页,编辑于2022年,星期一DoctorDoctor医生医生-Patient-Patient病人病人医生病人医生检查病人并开处方医生负责检查病人是否对药物敏感第67页,共96页,编辑于2022年,星期一DrugStoreDrugStore药店药店-Patient-Patient病人病人药店病
29、人药店出售药药店负责检查病人是否对药物敏感DRUGExpirationDateActiveElementsCriticLevel第68页,共96页,编辑于2022年,星期一Patient(Patient(病人病人)-SSA()-SSA(社会保障总署社会保障总署)病人SSA病人可能是SSA成员SSA成员可以只付药物的一部分价格,其余的由SSA支付第69页,共96页,编辑于2022年,星期一需求分析需求分析列出低于某一危险级别的药品列出保质期低于3个月的药品列出含有某一种成分的药品列出某一段时间销售的产品检查某一个药品是否过期第70页,共96页,编辑于2022年,星期一 SSKBag-KurWIT
30、HOUT_SSAWITH_SSAWITH_PRESCRIPTIONWITHOUT_PRESCRIPTIONSALESSales_DatePaymentcheckDate()Emek-SandPRESCRIPTIONDatePatient_nameDoctor_nameDrug_namesDRUGNameCritical_levelManufacturer_nameExpiration_datePreserve_conditionsActive_elementsWith_prescriptionStockPriceAmountcheckState()checkActiveElement()set
31、ExpiredState()SSANameAddressTelephone_noPayment_rateDRUGWAREHOUSENameAddressTelephone_nodrugs:ArrayListchangePrice()DRUGSTORENameAddressTelephone_nocheckAllergy()addSaleWithPrescription()addSaleWithoutPrescription()update()checkState()computePrice()reduceStocks()updateSSA()sell()hashas credit ongets
32、 drugDOCTORname:StringdoctorID:intaddress:StringtelNo:Stringpatients:ArrayListdrugs:ArrayListgivePrescription()checkAllergy()PATIENTNameAddressTelephone_nocheckAllergy()setPrescription()give prescriptionmember ofLOGGERlog()logslogslogs初始类图设计初始类图设计第71页,共96页,编辑于2022年,星期一WITHOUT_SSAWITH_SSAPRESCRIPTION
33、DatePatient_nameDoctor_nameDrug_namesSSANameAddressTelephone_noPayment_rateSSKBag-KurEmek-SandDRUGSTORENameAddressTelephone_nocheckAllergy()addSaleWithPrescription()addSaleWithoutPrescription()update()checkState()computePrice()reduceStocks()updateSSA()sell()has credit onPATIENTNameAddressTelephone_n
34、ocheckAllergy()setPrescription()give prescriptionLOGGERlog()DOCTORname:StringdoctorID:intaddress:StringtelNo:Stringpatients:ArrayListdrugs:ArrayListgivePrescription()checkAllergy()logslogslogsmember of第72页,共96页,编辑于2022年,星期一WITH_PRESCRIPTIONWITHOUT_PRESCRIPTIONSALESSales_DatePaymentcheckDate()DRUGNam
35、eCritical_levelManufacturer_nameExpiration_datePreserve_conditionsActive_elementsWith_prescriptionStockPriceAmountcheckState()checkActiveElement()setExpiredState()DRUGSTORENameAddressTelephone_no checkAllergy()update()checkState()computePrice()reduceStocks()updateSSA()addSaleWithPrescription()addSal
36、eWithoutPrescription()sell()hasgets drugDRUGWAREHOUSENameAddressTelephone_nodrugs:ArrayListchangePrice()第73页,共96页,编辑于2022年,星期一应用设计模式改进设计应用设计模式改进设计 改进初始设计使之可重用第74页,共96页,编辑于2022年,星期一Observer设计模式设计模式名称:Observer/Dependents/Publish-Subscribe结构意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新适用性当一个抽象
37、模型有两个方面,其中一个方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立地改变和复用当对一个对象的改变需要同时改变其它对象,而不知道具体有多少对象有待改变当一个对象必须通知其它对象,而它又不能假定其它对象是谁。换言之,你不希望这些对象是紧密耦合的123第75页,共96页,编辑于2022年,星期一观察者观察者/主题设计模式主题设计模式对象间存在一对多的(one-to-many)从属关系,当一个主题发生变化时将通知并更新所有与之关联的观察者观察者互不了解,但它们可以自如地工作a=50b=750c=300更改通知查询更新观观察察者者主主题题第76页,共96页,编辑于2022年,星期
38、一观察者观察者/主题的功能主题的功能知道它的观察者提供一个界面给attach/detach的观察者状态发生改变,通知观察者a=50b=750c=300定义和实现更新界面,用来接受变化通知保持对主题的引用观察者观察者主题主题第77页,共96页,编辑于2022年,星期一ObserverObserver设计模式的结构设计模式的结构第78页,共96页,编辑于2022年,星期一设计模式设计模式 观察者模式观察者模式WAREHOUSEObservers:ArrayListnotify()DRUGWAREHOUSENameAddressTelephone_nodrugs:ArrayListchangePri
39、ce()DRUGSTORENameAddressTelephone_nocheckAllergy()addSaleWithPrescription()addSaleWithoutPrescription()update()checkState()computePrice()reduceStocks()updateSSA()sell()STORElistSales()第79页,共96页,编辑于2022年,星期一ObserverObserver设计模式的顺序图设计模式的顺序图第80页,共96页,编辑于2022年,星期一观察者观察者 顺序图顺序图第81页,共96页,编辑于2022年,星期一State
40、State设计模式设计模式名称:State结构意图:允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类适用性一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态。这个状态通常用一个或多个枚举常量表示。通常,有多个操作包含这一相同的条件结构。State模式将每一个条件分支放入一个独立的类中。这使得你可以根据对象自身的情况将对象的状态作为一个对象,这一对象可以不依赖于其他对象而独立变化 12第82页,共96页,编辑于2022年,星期一StateState设计模式结构设计模式结构第83页,共96页
41、,编辑于2022年,星期一设计模式设计模式-State-StateNORMAL_STATEEXPIRED_STATEDRUGSTATEusableDRUGNameCritical_levelManufacturer_nameExpiration_datePreserve_conditionsActive_elementsWith_prescriptionStockPriceAmountcheckState()checkActiveElement()setExpiredState()has getPrice()getPrice()第84页,共96页,编辑于2022年,星期一应用设计模式后的类图应
42、用设计模式后的类图STATEOBSERVER第85页,共96页,编辑于2022年,星期一课外练习:课外练习:编译器编译器源程序表示为一个抽象语法树。该编译器需在抽象语法树上实施某些操作以进行“静态语义”分析,例如检查是否所有的变量都已经被定义了。它也需要生成代码。此外,还可使用抽象语法树进行优美格式打印、程序重构以及对程序进行多种度量。这些操作大多要求对不同的节点进行不同的处理。例如对代表赋值语句的结点的处理就不同于对代表变量或算术表达式的结点的处理。因此有用于赋值语句的类,有用于变量访问的类,还有用于算术表达式的类等等。第86页,共96页,编辑于2022年,星期一一种不好的设计一种不好的设计
43、NodeTypeCheck()GenerateCode()PrettyPrint()VariableRefTypeCheck()GenerateCode()PrettyPrint()AssignmentTypeCheck()GenerateCode()PrettyPrint()操作分散到各种结点类,系统难以理解、维护和修改操作分散到各种结点类,系统难以理解、维护和修改类型检查与优美格式打印或流程分析放在一起,混乱类型检查与优美格式打印或流程分析放在一起,混乱增加新的操作通常需要重新编译所有这些类增加新的操作通常需要重新编译所有这些类第87页,共96页,编辑于2022年,星期一设计优化设计优化请
44、用设计模式Visitor来对前述设计进行优化第88页,共96页,编辑于2022年,星期一StateState设计模式设计模式名称:Visitor结构意图:表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作适用性一个对象结构包含很多类对象,它们有不同的接口,而你想对这些对象实施一些依赖于其具体类的操作需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而你想避免让这些操作“污染”这些对象的类。Visitor使得你可以将相关的操作集中起来定义在一个类中。当该对象结构被很多应用共享时,用Visitor模式让每个应用仅包含需要用到的操作定义对
45、象结构的类很少改变,但经常需要在此结构上定义新的操作。改变对象结构类需要重定义对所有访问者的接口,这可能需要很大的代价。如果对象结构类经常改变,那么可能还是在这些类中定义这些操作较好第89页,共96页,编辑于2022年,星期一VisitorVisitor优化设计优化设计如果可以独立地增加新的操作,并且使这些结点独立于作用于其上的操作将所有节点类中相关的操作包装在一个独立的对象(称为一个Visitor)中,并在遍历抽象语法树时将此对象传递给当前访问的节点。当一个元素“接受”该访问者时,该元素向访问者发送一个包含自身类信息的请求。该请求同时也将该节点元素作为一个参数。然后访问者将为该元素执行该操作
46、第90页,共96页,编辑于2022年,星期一被访问的对象结构被访问的对象结构每一个结点在实现Accept时将会回调访问者NodeAccept(NodeVisitorv)VariableRefAccept(NodeVisitorv)AssignmentAccept(NodeVisitorv)Programv-VisitVariableRef(this)v-VisitAssignment(this)第91页,共96页,编辑于2022年,星期一访问者层次访问者层次TypeCheckingVisitAssignment(Assignment)VisitVariableRef(VariableRef)C
47、odeGeneratingVisitAssignment(Assignment)VisitVariableRef(VariableRef)NodeVisitorVisitAssignment(Assignment)VisitVariableRef(VariableRef)第92页,共96页,编辑于2022年,星期一访问者(访问者(VisitorVisitor)模式结构)模式结构VisitorVisitConcreteElementA(ConcreteElementA)VisitConcreteElementB(ConcreteElementB)ConcreteVisitor1VisitConc
48、reteElementA(ConcreteElementA)VisitConcreteElementB(ConcreteElementB)ClientObjectStructureElementAccept(Visitor)ConcreteElementAAccept(Visitorv)OperationA()ConcreteElementAAccept(Visitorv)OperationA()v-VisitConcreteElementA(this)第93页,共96页,编辑于2022年,星期一上机实验上机实验6 6时间:第十周,5月15日(星期二),8:00-10:30地点:602,612
49、内容:面向对象设计,写出设计文档并产生程序框架步骤:1、教师演示例子2、自己选定项目的设计要求:1、建模工具:RationalRose2、团队操练形式,分工协作完成第94页,共96页,编辑于2022年,星期一内容总结内容总结学习了面向对象设计的若干指导原则系统分解的方法设计对象的服务、类之间关联的方法优化设计的方法应该能够在设计原则的指导下,进行好的面向对象设计尤其是能够对面向对象分析得到的对象模型进行优化第95页,共96页,编辑于2022年,星期一No Silver BulletNo Silver Bullet OOD可能会让你头疼,因为要学会它、掌握它是很困难的;OOD甚至会让你失望,因为它也并不成熟、并不完美;OOD也会给你带来欣喜,它让你可以专注于设计,而不必操心那些细枝末节;OOD也会使你成为一个更好的设计师,它能提供给你很好的工具,让你能开发出更坚固、更可维护、更可复用的软件。第96页,共96页,编辑于2022年,星期一