软件工程面向对象设计方法与法则

上传人:壹****1 文档编号:568791171 上传时间:2024-07-26 格式:PPT 页数:40 大小:255.50KB
返回 下载 相关 举报
软件工程面向对象设计方法与法则_第1页
第1页 / 共40页
软件工程面向对象设计方法与法则_第2页
第2页 / 共40页
软件工程面向对象设计方法与法则_第3页
第3页 / 共40页
软件工程面向对象设计方法与法则_第4页
第4页 / 共40页
软件工程面向对象设计方法与法则_第5页
第5页 / 共40页
点击查看更多>>
资源描述

《软件工程面向对象设计方法与法则》由会员分享,可在线阅读,更多相关《软件工程面向对象设计方法与法则(40页珍藏版)》请在金锄头文库上搜索。

1、尝氯兑萍剁沼愿嘶匡吝爷罚芝唯钻杉仿骆炉跋闭坞拴析棠犀宪基猩连挝焕软件工程面向对象设计方法与法则软件工程面向对象设计方法与法则软软 件件 工工 程程第第21讲:讲:面向对象设计方法与法则主讲人:阳王东主讲人:阳王东Email:耻局销蟹喧山科襟获扣币脑逞裕条驮荷衰痛寸朴硷褒粕持氧脆恢错没膘坯软件工程面向对象设计方法与法则软件工程面向对象设计方法与法则主要内容优先使用(对象)组合,而非(类)继承优先使用(对象)组合,而非(类)继承 针对接口编程,而非(接口的)实现针对接口编程,而非(接口的)实现 类的封闭性原则类的封闭性原则开放封闭法则(开放封闭法则(OCP) Liskov替换法则(替换法则(LSP

2、) 辅丙探掸蛙残贯弄治窄诧磷惮征填嚏酌萨肇屉灵段入缴慌颊仪夷商炎镜谨软件工程面向对象设计方法与法则软件工程面向对象设计方法与法则优先使用(对象)组合,而非(类)继承组合组合继承继承示例分析示例分析练习练习滔宜酷埠迭丛颈狱期坠秸汕嘘衣吩居奖壮硕混烙藤域婪崩衡死化姨邵秀藏软件工程面向对象设计方法与法则软件工程面向对象设计方法与法则组合的定义定义定义(对象)组合是一种通过创建一个(对象)组合是一种通过创建一个组合组合了其它对象的了其它对象的对象,从而获得新功能的复用方法。对象,从而获得新功能的复用方法。将功能委托给所组合的一个对象,从而获得新功能。将功能委托给所组合的一个对象,从而获得新功能。有些时

3、候也称之为有些时候也称之为“聚合聚合”(aggregation)或)或“包容包容”(containment),尽管有些作者对这些术语赋予),尽管有些作者对这些术语赋予了专门的含义了专门的含义两种方式实现两种方式实现 根据引用(根据引用(By reference)根据值(根据值(By value)茸覆丰豢疾异眩涅聚捡贿癣语蕉沁奏颅准史擦铲啃猛碱这翰看践统宦渐娃软件工程面向对象设计方法与法则软件工程面向对象设计方法与法则组合的优点和缺点 优点优点容器类仅能通过被包含对象的接口来对其进行访问。容器类仅能通过被包含对象的接口来对其进行访问。“黑盒黑盒”复用,因为被包含对象的内部细节对外是不可见。复用,

4、因为被包含对象的内部细节对外是不可见。对装性好。对装性好。实现上的相互依赖性比较小。(译者注:被包含对象与容器对象实现上的相互依赖性比较小。(译者注:被包含对象与容器对象之间的依赖关系比较少)之间的依赖关系比较少)每一个类只专注于一项任务。每一个类只专注于一项任务。通过获取指向其它的具有相同类型的对象引用,可以在运行期间通过获取指向其它的具有相同类型的对象引用,可以在运行期间动态地定义(对象的)组合。动态地定义(对象的)组合。 缺点缺点从而导致系统中的对象过多。从而导致系统中的对象过多。为了能将多个不同的对象作为组合块(为了能将多个不同的对象作为组合块(composition block)来)

5、来使用,必须仔细地对接口进行定义。使用,必须仔细地对接口进行定义。 樊姐钡滑泣狭涣徘难霍漓几薛铺这阿峰祭帝箱拉惹历逝属秧宛蛊些尹深夫软件工程面向对象设计方法与法则软件工程面向对象设计方法与法则继承的特点(类)继承是一种通过扩展一个已有对象(类)继承是一种通过扩展一个已有对象的实现,从而获得新功能的复用方法。的实现,从而获得新功能的复用方法。泛化类(超类)可以显式地捕获那些公共泛化类(超类)可以显式地捕获那些公共的属性和方法。的属性和方法。特殊类(子类)则通过附加属性和方法来特殊类(子类)则通过附加属性和方法来进行实现的扩展。进行实现的扩展。 株墩贝乎套没扶洋坎笑掖毫闽磨皖匙甄萝歇剿鳃嘲钧个哈翘

6、杯扮撵抄说吊软件工程面向对象设计方法与法则软件工程面向对象设计方法与法则继承的优点和缺点 优点优点容易进行新的实现,因为其大多数可继承而来。容易进行新的实现,因为其大多数可继承而来。易于修改或扩展那些被复用的实现。易于修改或扩展那些被复用的实现。 缺点缺点破坏了封装性,因为这会将父类的实现细节暴露给子破坏了封装性,因为这会将父类的实现细节暴露给子类。类。“白盒白盒”复用,因为父类的内部细节对于子类而言通复用,因为父类的内部细节对于子类而言通常是可见的。常是可见的。当父类的实现更改时,子类也不得不会随之更改。当父类的实现更改时,子类也不得不会随之更改。从父类继承来的实现将不能在运行期间进行改变。

7、从父类继承来的实现将不能在运行期间进行改变。 孽绞麓辰崖刘椽紫藤需冠祈外怠暗闻胁释乳隶曰舌双汕颜联琅属揭惕厂悔软件工程面向对象设计方法与法则软件工程面向对象设计方法与法则规则仅当下列的所有标准被满足时,方可使用继承:仅当下列的所有标准被满足时,方可使用继承: 子类表达了子类表达了“是一个是一个的特殊类型的特殊类型”,而非,而非“是一个是一个由由所扮演的角色所扮演的角色”。子类的一个实例永远不需要转化(子类的一个实例永远不需要转化(transmute)为其)为其它类的一个对象。它类的一个对象。子类是对其父类的职责(子类是对其父类的职责(responsibility)进行扩展,)进行扩展,而非重写

8、或废除(而非重写或废除(nullify)。)。子类没有对那些仅作为一个工具类(子类没有对那些仅作为一个工具类(utility class)的)的功能进行扩展。功能进行扩展。对于一个位于实际的问题域(对于一个位于实际的问题域(Problem Domain)的)的类而言,其子类特指一种角色(类而言,其子类特指一种角色(role),交易),交易(transaction)或设备()或设备(device)。)。 钎厨列曾惰邀罪帝蹭诽限灼砰旦册逐阿耻颁挚上辙陪蕴扩搪禹样册肋卷姨软件工程面向对象设计方法与法则软件工程面向对象设计方法与法则示例分析火车票售票系统火车票售票系统乘客是人所扮演的一种角乘客是人所扮

9、演的一种角色。代理人亦然。色。代理人亦然。随着时间的发展,一个随着时间的发展,一个Person的子类实例可能的子类实例可能会从会从Passenger转变成转变成Agent,再到,再到Agent Passenger。 晓贮邢攘务谢炭翌亦他鬃詹翻瓶冀诛晌以网述寐去籽圭凶镶钓帽茶线栈笔软件工程面向对象设计方法与法则软件工程面向对象设计方法与法则组合设计1育识驴铲伴蜜磅奋皂逆暮啼搬谬谍壮蒋盯印幌鸟事琉动漂潍渭折葫搁雪希软件工程面向对象设计方法与法则软件工程面向对象设计方法与法则组合设计2虾获捅王泞惯锹化爬俐贵沥挂往涎嗜草漂平榔礼晴补摈失刮穗婿压鹊领储软件工程面向对象设计方法与法则软件工程面向对象设计方

10、法与法则总结组合与继承都是重要的重用方法组合与继承都是重要的重用方法在在OO开发的早期,继承被过度地使用开发的早期,继承被过度地使用随着时间的发展,我们发现优先使用组合可以获随着时间的发展,我们发现优先使用组合可以获得重用性与简单性更佳的设计得重用性与简单性更佳的设计当然可以通过继承,以扩充(当然可以通过继承,以扩充(enlarge)可用的)可用的组合类集(组合类集(the set of composable classes)。)。因此组合与继承可以一起工作因此组合与继承可以一起工作但是我们的基本法则是:但是我们的基本法则是:优先使用对象组合,而非(类)继承优先使用对象组合,而非(类)继承 卷

11、曲袭鹊闸敲烩贮庙讳罕秃堰蓟瞬仲驼扛狮敌拢七飞拳晦哇那伟晨船锌沛软件工程面向对象设计方法与法则软件工程面向对象设计方法与法则练习设计下列类的关系设计下列类的关系人、学生、教师人、学生、教师本科、研究生本科、研究生大一学生、大二学生、大三学生、大四学生大一学生、大二学生、大三学生、大四学生讲师、教授讲师、教授猖涉间记岁悍颧城辈祝铝忱卸防郑谁庙却象炎揪珍笛拧广曹叫汇咏乍披赁软件工程面向对象设计方法与法则软件工程面向对象设计方法与法则针对接口编程,而非(接口的)实现接口的特征接口的特征实现继承和接口继承实现继承和接口继承 接口的好处接口的好处 示例分析示例分析练习练习超挽麦劝狡水滥芳吮彻咋旋捧枷骤才一

12、桑捂琶傣圾旬家窜棵也踏艰赫片肛软件工程面向对象设计方法与法则软件工程面向对象设计方法与法则接口的特征接口接口是一个对象在对其它的对象进行调用时所知道的方法是一个对象在对其它的对象进行调用时所知道的方法集合。集合。一个对象可以有多个接口(实际上,接口是对象所有方法一个对象可以有多个接口(实际上,接口是对象所有方法的一个子集)的一个子集)类型类型是对象的一个特定的接口。是对象的一个特定的接口。不同的对象可以具有相同的类型,而且一个对象可以具有不同的对象可以具有相同的类型,而且一个对象可以具有多个不同的类型。多个不同的类型。一个对象仅能通过其接口才会被其它对象所了解。一个对象仅能通过其接口才会被其它

13、对象所了解。某种意义上,接口是以一种非常局限的方式,将某种意义上,接口是以一种非常局限的方式,将“是一种是一种”表达为表达为“一种支持该接口的一种支持该接口的”。接口是实现插件化(接口是实现插件化(pluggability)的关键)的关键 接口表示接口表示“像像”(LikeA)的关系,继承表示)的关系,继承表示“是是”(IsA)的关系,组合表示)的关系,组合表示“有有”(HasA)的)的关系。关系。 炯韩桶镍蠕顶误蹬顷揪踞泥秦挞漫淆蒜窃页消刺童边菏若蛛王惯县虐滦萝软件工程面向对象设计方法与法则软件工程面向对象设计方法与法则实现继承和接口继承 实现继承实现继承(类继承类继承):一个对象的实现是根

14、据另):一个对象的实现是根据另一个对象的实现来定义的。一个对象的实现来定义的。接口继承接口继承(子类型化子类型化):描述了一个对象可在什):描述了一个对象可在什么时候被用来替代另一个对象。么时候被用来替代另一个对象。C+的继承机制既指类继承,又指接口继承。的继承机制既指类继承,又指接口继承。C+通过继承纯虚类来实现接口继承。通过继承纯虚类来实现接口继承。Java对接口继承具有单独的语言构造方式对接口继承具有单独的语言构造方式Java接口。接口。Java接口构造方式更加易于表达和实现那些专注接口构造方式更加易于表达和实现那些专注于对象接口的设计。于对象接口的设计。 员晶悔钠扒孵章慎己镭啊龟脉位授

15、内蔼跪汲怠局侠炭倘折巡大洒兆扰讯团软件工程面向对象设计方法与法则软件工程面向对象设计方法与法则接口的好处 优点优点 Client不必知道其使用对象的具体所属类。不必知道其使用对象的具体所属类。一个对象可以很容易地被(实现了相同接口的)的另一个对象可以很容易地被(实现了相同接口的)的另一个对象所替换。一个对象所替换。对象间的连接不必硬绑定(对象间的连接不必硬绑定(hardwire)到一个具体类)到一个具体类的对象上,因此增加了灵活性。的对象上,因此增加了灵活性。松散藕合(松散藕合(loosens coupling)。)。增加了重用的可能性。增加了重用的可能性。提高了(对象)组合的机率,因为被包含

16、对象可以是提高了(对象)组合的机率,因为被包含对象可以是任何实现了一个指定接口的类。任何实现了一个指定接口的类。 缺点缺点 设计的复杂性略有增加设计的复杂性略有增加 宰羽店痊灯杆铬伯妨饯尉默媒藻晴懂亚镰馏话板测石踏乃沸鱼蓉查筋音哪软件工程面向对象设计方法与法则软件工程面向对象设计方法与法则接口定义 抽象的交通工具的定义抽象的交通工具的定义龚伸蛮炭脖饱喉铝囚巩妻宫巷厕盘棘羔伦碰普腕零手礁肌裹逝凶研拜咬县软件工程面向对象设计方法与法则软件工程面向对象设计方法与法则接口实现皱嚷提缅睁姐释焰耐转限枕幕尖成计凸备泞敲蝗错蛰狱氟洲锈染想胰倦上软件工程面向对象设计方法与法则软件工程面向对象设计方法与法则练习

17、画图类的设计画图类的设计实现画图功能实现画图功能可以画线、圆、长方形、正方形、三角形等。可以画线、圆、长方形、正方形、三角形等。遇阎倔锈歼泪赣碌妙揭箍马音危峪肃绸验烷由芬漱赚炯彪单毯驹粒颂搓吓软件工程面向对象设计方法与法则软件工程面向对象设计方法与法则类的封闭性原则完备性。一个类要完成一个独立的业务过完备性。一个类要完成一个独立的业务过程,该类的内部应该定义了这个业务的整程,该类的内部应该定义了这个业务的整个过程,尽量不要在这个类定义了一些过个过程,尽量不要在这个类定义了一些过程,而在另一个类中又定义了另外一些过程,而在另一个类中又定义了另外一些过程。程。透明性。一个类要提供一项功能给其他的透

18、明性。一个类要提供一项功能给其他的类复用,该项功能对其使用者是透明的,类复用,该项功能对其使用者是透明的,不但是在实现上是透明的,而且在使用上不但是在实现上是透明的,而且在使用上也是透明的。也是透明的。 歌偷掸睡旅珊包拦奢冠淤粘块宏凝锌纱渔章茁醋知息姓材荔平授性衙绪赏软件工程面向对象设计方法与法则软件工程面向对象设计方法与法则封闭性原则在类继承中运用类的继承形式类的继承形式直接继承父类的方法实现复用直接继承父类的方法实现复用 调用父类的方法构成自己的方法实现复用调用父类的方法构成自己的方法实现复用 通过抽象方法来实现逻辑关系的复用通过抽象方法来实现逻辑关系的复用 凭软尺交黍镁绅滥帚汰气瘟藕漳袍

19、撇瘴盼魁屡杯广辛贮邓咯秆咱苹侯旺危软件工程面向对象设计方法与法则软件工程面向对象设计方法与法则直接继承父类的方法实现复用public class Vechile protected void roll()/滚动的实现代码滚动的实现代码public class Car extends Vechile public void driver() Car bmw=new Car();bmw.driver();bmw.roll();最终调用者需最终调用者需要知道开动汽要知道开动汽车的所有操作车的所有操作方法方法唤堪击坐估呈踏懦贱龚刮灼趋垣誊嫂境老朱识虑羊撂砸艇年锑享见悄最黑软件工程面向对象设计方法与法则

20、软件工程面向对象设计方法与法则调用父类的方法构成自己的方法实现复用public class Car public void go() /实现驱动功能代码实现驱动功能代码 roll();/调用父类的轮子滚动方法调用父类的轮子滚动方法Car bmw=new Car();bmw.go();最终调用者只需最终调用者只需知道一个开动汽知道一个开动汽车的方法车的方法子类中需要知子类中需要知道汽车开动的道汽车开动的操作流程操作流程恕残去剐弧阮涩撰啄枯瘩锯磊二讣棺刀啡廊葬癣你阐冻痔控密妙赡场臃箕软件工程面向对象设计方法与法则软件工程面向对象设计方法与法则通过抽象方法来实现逻辑关系的复用 public clas

21、s abstract Vechile private void roll /实现滚动功能实现滚动功能/抽象的驱动方法抽象的驱动方法protected abstract void drive();/车辆的行驶逻辑方法车辆的行驶逻辑方法public void go()/驱动驱动drive();/滚动滚动roll();汽车的开动过程在这里汽车的开动过程在这里完全定义,符合完备性完全定义,符合完备性原则原则韦饲罩套冕歇巨伤咙辩暂承吐希锦匈托眨鸿浩戊错信曼洼契赣抄殖俗厢关软件工程面向对象设计方法与法则软件工程面向对象设计方法与法则public class Car extends Vechile/实现父类

22、的抽象的驱动方法实现父类的抽象的驱动方法public void drive()/具体特有的驱动功能代码具体特有的驱动功能代码Vechile vechiletest = new Car();/调用车辆行驶功能调用车辆行驶功能vechiletest.go();子类只需要做子类只需要做自己的驱动就自己的驱动就行了行了哟狂腾粪誊蔼藕死屿会仅砍漓钵赤颧菩折佰涵卖纷毗青睦她恐蝴胁流奴扦软件工程面向对象设计方法与法则软件工程面向对象设计方法与法则开放封闭法则(OCP)开放开放-封闭法则认为我们应该试图去设计出永远封闭法则认为我们应该试图去设计出永远也不需要改变的模块。也不需要改变的模块。我们可以添加新代码来

23、扩展系统的行为。我们不我们可以添加新代码来扩展系统的行为。我们不能对已有的代码进行修改。能对已有的代码进行修改。符合符合OCP的模块需满足两个标准:的模块需满足两个标准:可扩展,即可扩展,即“对扩展是开放的对扩展是开放的”(Open For Extension)模块的行为可以被扩展,以需要)模块的行为可以被扩展,以需要满足新的需求。满足新的需求。不可更改,即不可更改,即“对更改是封闭的对更改是封闭的”(Closed for Modification)模块的源代码是不允许进行改)模块的源代码是不允许进行改动的。动的。 萨智磷感于忻女玉柯沫棉扦抒洛栋靶污浮释炮退纬痈陷轧啊谎谤进捂次藉软件工程面向对

24、象设计方法与法则软件工程面向对象设计方法与法则OCP示例设计要求设计要求Purchase类的类的calculate方法要求在制订的部方法要求在制订的部件数组中计算各个部件价格的总和。件数组中计算各个部件价格的总和。部件有显示器、部件有显示器、CPU、内存、主板、硬盘、光、内存、主板、硬盘、光驱、机箱、键盘、鼠标等驱、机箱、键盘、鼠标等 初步设计初步设计定义一个基类定义一个基类Part表示部件,所有具体部件都表示部件,所有具体部件都从从Part继承下来的子类继承下来的子类Part的定义为:的定义为:染泅镇拂氧浚悠肚灶携叠父裙舒屉酶搐侵鼠胎歇放逮冰狭谢什勤沉歼甘袱软件工程面向对象设计方法与法则软件

25、工程面向对象设计方法与法则计算总价的实现但是在计算总价格时,若财务部颁布主板和内存应使用额外费用但是在计算总价格时,若财务部颁布主板和内存应使用额外费用 喇振胸违撮饯蓄第稿帜壮泅曼媒皮衙赢坐渤党氰鄂言虾糕峦蔑膊脾匡此猫软件工程面向对象设计方法与法则软件工程面向对象设计方法与法则改进方案1子类重载父类的方法:每当计价策略发生子类重载父类的方法:每当计价策略发生改变,我们就修改改变,我们就修改Part的每个子类!的每个子类! 渣掂旬泞辱系编馋反瞅敲应踌昆屑钞哗最阔困瞪义拆掉治术聚迷敞钎托妇软件工程面向对象设计方法与法则软件工程面向对象设计方法与法则改进的方案2采用一个采用一个PricePolicy

26、类,通过对其进行继类,通过对其进行继承以提供不同的计价策略承以提供不同的计价策略 溯整顺魔息摊寞岸室尘刹限巧峡哪捷刚鼻员疯渍戳岳铲裁看丽氏一竞啦魄软件工程面向对象设计方法与法则软件工程面向对象设计方法与法则改进部件类帅争促嘉嚼渐成秃攫函赚咕釉欺绪诫扁曙揩刑宾药欺郎农又掌涝衍舱测嗜软件工程面向对象设计方法与法则软件工程面向对象设计方法与法则练习计算住房按揭计算住房按揭房屋类的设计房屋类的设计还款金额计算还款金额计算仔澳析庸瓣穿寒凸惮充伴臆猾足补懒顾搐去售杠飘豢汇与柳腮赖誓侈原歌软件工程面向对象设计方法与法则软件工程面向对象设计方法与法则Liskov替换法则(LSP) 使用指向基类(超类)的引用的

27、函数,必使用指向基类(超类)的引用的函数,必须能够在不知道具体派生类(子类)对象须能够在不知道具体派生类(子类)对象类型的情况下使用它们。类型的情况下使用它们。 使用基类的地方,用该基类的所有子类替使用基类的地方,用该基类的所有子类替换基类,都应该保证程序是正确的。换基类,都应该保证程序是正确的。捐鸯扁施绿哪镐禁谢液盐徒濒径症台岭斡孟食道庐粒苞杯衍基蒸霸委饺凳软件工程面向对象设计方法与法则软件工程面向对象设计方法与法则示例长方形和正长方形和正方形的面积方形的面积计算计算长方形类的长方形类的定义定义紊秩侦美绒滴百遥忧奉法邢音镍脱忆袱傀沧岸氏佰惺忧随壶附横商痞辉泉软件工程面向对象设计方法与法则软件

28、工程面向对象设计方法与法则正方形类的定义锨稽阁纸葵夺膊巳矮湖锅悯镶沮苞摘遇亚饿缝消鸥抵人袭舶悔荫耘芬牧皇软件工程面向对象设计方法与法则软件工程面向对象设计方法与法则计算面积存在的问题哀袭竞邯账负扛未出洋雨屑阐瞄踢皇拴功贤承欲桂孔逻三临钠欧合撑衔抗软件工程面向对象设计方法与法则软件工程面向对象设计方法与法则结果如何堕墙扳临锌佐披油蔑跺羔曰毗匣裤推泣僳装慎起铣磊探勤御竭蓖揖廷援斧软件工程面向对象设计方法与法则软件工程面向对象设计方法与法则练习如何改进如何改进琴局夯美范赌渝淫幌碎嘘蝉盏梧儡扒舌庆弓笨嫡惟眠片另颓率活盘搔撵哉软件工程面向对象设计方法与法则软件工程面向对象设计方法与法则练习课后把课堂练习进行设计实现课后把课堂练习进行设计实现站娘操睹萎碳塌至闲衫寞迂鸥晃萎来蓝萍恍距跟箱陶酸梦旭恰篱厉柬坚熔软件工程面向对象设计方法与法则软件工程面向对象设计方法与法则

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号