多媒体课件-第二讲课件-类图.ppt
面向对象的分析与设计 课程学习的内容l lOO设计原则l lUML设计图及Rose Rational 工具l lOO设计模式l l典型项目的分析与设计 学习方法l l掌握主要掌握主要OOOO原则的原理和应用要点原则的原理和应用要点 改变改变javajava编程习惯编程习惯l l学会设计学会设计 Rational Rational工具的使用;工具的使用;掌握类图、用例图、顺序图、活动图的设计掌握类图、用例图、顺序图、活动图的设计l l熟练掌握熟练掌握MVC MVC 设计方法设计方法l l 熟练掌握数据库编程熟练掌握数据库编程l l 深化了解深化了解APIAPI,深化基于,深化基于APIAPI的编程的编程l l 反复实践典型模式应用于项目的分析和设计反复实践典型模式应用于项目的分析和设计参考书l l面向对象软件工程与 UML,李飞跃,人民邮电出版社(高职教材)l lUML与软件建模,徐宝文,清华大学出版社(重点大学教材)l l面向对象设计原理与模式,(美)Dale Skrien著,清华大学出版社(国外经典教材)l l Java设计模式,耿祥义,清华大学出版社l l大话设计模式,程杰,清华大学出版社考核基于典型项目的考察:l l项目的分析与方案设计l lUML典型图l l项目代码中基本原则的应用l l项目设计中模型的使用OOP编程要点 OOPOOP追求的目标追求的目标:可用性、完整性、健壮性、有效性、可伸缩性、可读性、可重用性、简洁性、可维护性、可扩充行 OOP 典型特点:封装性、继承性、重载、属性和修饰符、多态、重构、抽象类 接口、集合、泛型、委托与事件 实现一个最简单的实例l l计算立体型几何体体积 要点:分析其中的耦合性、程序的复用性 “脏代码”分析 OO基本原则单一职责原则单一职责原则要点要点:开开-闭原则闭原则依赖倒转原则依赖倒转原则里氏替换原则里氏替换原则面向抽象原则面向抽象原则多用组合少用继承原则多用组合少用继承原则迪米特原则迪米特原则高内聚高内聚/低耦合原则低耦合原则合成合成/聚集复用原则聚集复用原则接口隔离原则接口隔离原则单一职责原则(SRP原则)l l就一个类而言,应该只有一个引起它变化的原因;就一个类而言,应该只有一个引起它变化的原因;l l失败的案例:失败的案例:界面处理类界面处理类+数据库操作数据库操作+文件读写文件读写+业务流程控制业务流程控制 类比:类比:多功能手机、集成主板的电脑多功能手机、集成主板的电脑坏一处就全坏坏一处就全坏l l经验:类的设计倾向于越小越好l l解释:如果一个类承担的职责过多,就等于把这些职责耦合在一起。一个职责的变化可能会引起消弱或抑制这个类完成其他职责的功能。这种耦合会导致脆弱的设计。当变化发生时,设计会遭到意想不到的破坏。开-闭原则(核心原则)l l软件实体(类、模块、方法)应该可以扩展,但不可以修改;l l换个说法:类对扩展是开放的,对修改是封闭的;l l用extends 和implements等开放,用private封闭l l实际使用:1.随时准备修改:改变是合理的;2.原来的代码一般不要改动,合理的方法是 基于原先的代码产生新的类 3.设计之初就准备好应对变化,用抽象来隔 离变化,减少耦合。开-闭原则的运用:l l写一个相对固定的内核;l l不断产生新的类,当修改发生时;l l 新的类给予接口或抽象类创建;理解:面向接口编程里氏替换原则l l子类型必须能替换掉它们的父类型分析:“企鹅不是鸟”子类型必须包含父类型的全部特征 依赖倒转原则l l抽象不应该依赖于细节,细节应该依赖于抽象;-针对接口编程,不要对实现编程l l解释:1.高层类不应该依赖低层类;两者都应依赖于 抽象;2.抽象不应该依赖细节;细节应该依赖抽象l l反转实例:电话指挥修电脑,谁依赖谁?l l抽象与实现:电脑主板-总线插槽-PIC卡的实例 抽象不依赖细节,细节依赖抽象。依赖止于接口-用接口消除强耦合AB依赖AB依赖I依赖用接口消除强耦合OO的基本原则l l8989、面向对象的基本设计原则、面向对象的基本设计原则1)LSP(The Liskov Substitution Principle):Liskov1)LSP(The Liskov Substitution Principle):Liskov替换原则替换原则子类不能添加任何父类没有的附加约束。子类对象必须可以替换基类对象。子类不能添加任何父类没有的附加约束。子类对象必须可以替换基类对象。在可能的情况下,由抽象类在可能的情况下,由抽象类(接口接口)继承。继承。抽象类与具体类抽象类与具体类只要有可能,不要从具体类继承;只要有可能,不要从具体类继承;行为集中的方向是向上的行为集中的方向是向上的(抽象类抽象类);数据集中的方向是向下的数据集中的方向是向下的(具体类具体类)。l l2)OCP(The Open-Close Principle):2)OCP(The Open-Close Principle):开放开放-封闭原则封闭原则对于扩展是开放的对于扩展是开放的(Open for extension)(Open for extension)对于更改是封闭的对于更改是封闭的(Closed for modification)(Closed for modification)关键在于抽象关键在于抽象抽象预见了可能的所有扩展抽象预见了可能的所有扩展(闭闭)由抽象可以随时导出新的类由抽象可以随时导出新的类(开开)OCPOCP是是OODOOD中很多说法的核心。中很多说法的核心。LSPLSP是是OCPOCP成为可能的主要原则之一。成为可能的主要原则之一。3)SRP3)SRP单一职责原则单一职责原则(The Single Responsibility Principle)(The Single Responsibility Principle)一个类,应该仅有一个引起它变化的原因。一个类,应该仅有一个引起它变化的原因。体现了内聚性体现了内聚性(Cohesion)(Cohesion):一个模块的组成元素之间的功能相关性。:一个模块的组成元素之间的功能相关性。违反违反SRPSRP原则会带来物理依赖的缺点。原则会带来物理依赖的缺点。使得每个类仅有一个职责。使得每个类仅有一个职责。4)ISP4)ISP接口隔离原则接口隔离原则(The Interface Segregation Principle)(The Interface Segregation Principle)客户应该仅知道所需要要的接口。客户应该仅知道所需要要的接口。一个类实现多个接口,避免一个类实现多个接口,避免“肥接口肥接口(fat interface)”(fat interface)”使用委托分离接口使用委托分离接口,Adapter,Adapter模式模式;使用多重继承分离接口。使用多重继承分离接口。本质:本质:使用多个专门的接口比使用单一的接口好。使用多个专门的接口比使用单一的接口好。一个类对另一个类的依赖性应当是建立在最小的接口上的。一个类对另一个类的依赖性应当是建立在最小的接口上的。避免接口污染避免接口污染(Interface Pollution)(Interface Pollution)5)DIP5)DIP依赖倒置原则依赖倒置原则(The Dependency Inversion Principle)(The Dependency Inversion Principle)高层模块不依赖于低层模块,二者都依赖于抽象。高层模块不依赖于低层模块,二者都依赖于抽象。抽象不应该依赖于细节,细节应该依赖于抽象。抽象不应该依赖于细节,细节应该依赖于抽象。针对接口编程,而不是针对实现编程。针对接口编程,而不是针对实现编程。BoochBooch:所有结构良好面向对象架构都具有清晰地层次定义,每个层次通过一个定义良好的、受控的接口向外提供了一组类聚的服务。:所有结构良好面向对象架构都具有清晰地层次定义,每个层次通过一个定义良好的、受控的接口向外提供了一组类聚的服务。6)6)启发式原则启发式原则依赖于抽象依赖于抽象依赖关系都应终止于抽象类或者接口。依赖关系都应终止于抽象类或者接口。任何变量都不应该拥有指向具体类的指针或者引用。任何变量都不应该拥有指向具体类的指针或者引用。任何类都不应该从具体类派生。任何类都不应该从具体类派生。任何方法都不应该改写其任何基类中已经实现的方法。任何方法都不应该改写其任何基类中已经实现的方法。系统设计分析-UML图常用的UML图:用例图,类图,时序图,状态图 类图l l类图是一种静态设计图,常用于系统分析阶段l l类图反映了系统设计中类和类之间的关系l l需要掌握的概念:类(含接口)的UML图标识 类-类,类-接口的图形化标识 类与类、类与接口的6种关系 UML中的类图l l类图中的类图中的6 6种关系种关系 1.1.继承继承(泛化泛化)关系关系;2.;2.实现关系实现关系;3.;3.依赖关系依赖关系;4.4.关联关系关联关系;5.;5.组合关系组合关系 6.6.聚合关系聚合关系;l l类图设计要点类图设计要点:1.1.指向实体的关系用实线;指向实体的关系用实线;指向虚体(接指向虚体(接 口和抽象口和抽象类)的关系用虚拟线;类)的关系用虚拟线;2.2.箭头指向时间上先定义的类箭头指向时间上先定义的类 3.3.明确明确is-a,has-a,like-ais-a,has-a,like-a的画法的画法 4.4.普通关联的数量关系的标识普通关联的数量关系的标识类图实例练习l l实现几何体面积计算,画出类图l l分析图书借阅管理系统中,借书者和图书之间的关系