面向对象设计原则精选文档.ppt

上传人:石*** 文档编号:45280664 上传时间:2022-09-23 格式:PPT 页数:28 大小:1.52MB
返回 下载 相关 举报
面向对象设计原则精选文档.ppt_第1页
第1页 / 共28页
面向对象设计原则精选文档.ppt_第2页
第2页 / 共28页
点击查看更多>>
资源描述

《面向对象设计原则精选文档.ppt》由会员分享,可在线阅读,更多相关《面向对象设计原则精选文档.ppt(28页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、面向面向对象象设计原原则本讲稿第一页,共二十八页内容提要内容提要面向过程设计和面向对象设计的区别面向过程设计和面向对象设计的区别面向对象设计和面向对象分析的区别面向对象设计和面向对象分析的区别面向对象设计的面向对象设计的5条原则条原则本讲稿第二页,共二十八页计算机语言的发展计算机语言的发展机器语言机器语言汇编语言汇编语言高级语言高级语言面向对象语言面向对象语言计算机语言的发展方向是为了人类能够更好的理解。计算机语言的发展方向是为了人类能够更好的理解。本讲稿第三页,共二十八页面向过程设计思想和面向对象设计思想面向过程设计思想和面向对象设计思想我要去广场我要去广场面向过程:面向过程:我上车,我挂挡

2、,我踩油门,我过昌北,我过八一桥我上车,我挂挡,我踩油门,我过昌北,我过八一桥.我到广场我到广场面向对象面向对象:我命令车去广场我命令车去广场车是怎么走的我不用知道车是怎么走的我不用知道车相当于一个黑盒,所有的信息都封装在车这个类里车相当于一个黑盒,所有的信息都封装在车这个类里面面我不用去了解车是如何工作运行的我不用去了解车是如何工作运行的本讲稿第四页,共二十八页面向过程设计思想和面向对象设计思想面向过程设计思想和面向对象设计思想面向过程设计和面向对象设计所关注的层面面向过程设计和面向对象设计所关注的层面不同,或者说两者的复用层面不同。不同,或者说两者的复用层面不同。面向过程设计关注的是方法,

3、在方法层面上面向过程设计关注的是方法,在方法层面上进行复用。进行复用。面向对象设计则是隐藏了类的方法和细节,面向对象设计则是隐藏了类的方法和细节,直接在对象层面上进行复用。直接在对象层面上进行复用。本讲稿第五页,共二十八页面向对象设计面向对象设计(OOD)和面向对象分析和面向对象分析(OOA)OOA偏重于理解问题,描述软件偏重于理解问题,描述软件要做什么要做什么,而而OOD偏重于理解解决方案,描述软件偏重于理解解决方案,描述软件要如要如何做何做。OOA只考虑理想的设计,不关心技术与实现只考虑理想的设计,不关心技术与实现底层的细节,而底层的细节,而OOD需要得到更具体详细更需要得到更具体详细更接

4、近于现实的代码的设计方案接近于现实的代码的设计方案。在设计结果的描述上,在设计结果的描述上,OOA偏重于描述对象偏重于描述对象的行为,的行为,OOD偏重于描述对象的属性与方法偏重于描述对象的属性与方法。本讲稿第六页,共二十八页面向对象分析面向对象分析(OOA)的主要任务的主要任务根据用户需求,建立一个准确的、完整的、一致的根据用户需求,建立一个准确的、完整的、一致的系统系统模型模型。该过程产生三个分析模型:。该过程产生三个分析模型:功能模型功能模型:把用户的功能性需求转化为开发人员和用户都:把用户的功能性需求转化为开发人员和用户都能理解的一种表达方式,其结果就是用例模型。能理解的一种表达方式,

5、其结果就是用例模型。对象模型对象模型:通过对用例模型的分析,把系统分解成互相协:通过对用例模型的分析,把系统分解成互相协作的分析类。一般情况下,我们通过类图和对象图来描述系作的分析类。一般情况下,我们通过类图和对象图来描述系统中所有对象、对象属性、及对象之间的相互关系。对象模统中所有对象、对象属性、及对象之间的相互关系。对象模型就是系统的静态模型。型就是系统的静态模型。动态模型动态模型:描述系统的动态行为,一般用顺序图和协作:描述系统的动态行为,一般用顺序图和协作图来描述系统中对象之间的交互关系。图来描述系统中对象之间的交互关系。本讲稿第七页,共二十八页面向对象设计的主要任务面向对象设计的主要

6、任务细化重组类细化重组类 细化和实现类间关系细化和实现类间关系,明确其可见性明确其可见性 增加属性增加属性,指定属性的类型与可见性指定属性的类型与可见性 分配职责分配职责,定义执行每个职责的方法定义执行每个职责的方法 对消息驱动的系统对消息驱动的系统,明确消息传递方式明确消息传递方式利用设计模式进行局部设计利用设计模式进行局部设计 画出详细的类图与时序图画出详细的类图与时序图本讲稿第八页,共二十八页面向对象设计面向对象设计同样一块布,不同的裁缝可以做出不同的衣同样一块布,不同的裁缝可以做出不同的衣服,相同款式的衣服,做工也有好坏之分;服,相同款式的衣服,做工也有好坏之分;同样是发动机,由于设计

7、的不同,所带来的同样是发动机,由于设计的不同,所带来的功率和油耗也会有高有低。功率和油耗也会有高有低。在面向对象设计中,如何通过很小的设计改在面向对象设计中,如何通过很小的设计改变就可以提高系统性能或应对更多设计需求变就可以提高系统性能或应对更多设计需求的变化,这是令设计者极为关注的问题。的变化,这是令设计者极为关注的问题。本讲稿第九页,共二十八页例题分析例题分析 现现欲欲对对某公司的工作人某公司的工作人员员建立一个系建立一个系统统的分的分类类管理方式,管理方式,该该公司公司员员工有工有软软件件员员工和工和硬件硬件员员工两种,按工作种工两种,按工作种类类分有全分有全职员职员工和工和兼兼职员职员

8、工。工。试试画出一个可以表示画出一个可以表示这这种关系的种关系的分分类类方法。方法。本讲稿第十页,共二十八页本讲稿第十一页,共二十八页OO的设计原则的设计原则单一职责原则单一职责原则(SingleResponsiblityPrinciple,SRP)开闭原则开闭原则(Open/ClosePrincipleOCP)Liskov替换原则替换原则(LiskovSubstitutionPrinciple,LSP)依赖倒置原则依赖倒置原则(DependencyInversionPrinciple,DIP)接口分离原则接口分离原则(InterfaceSegregationPrinciple,ISP)本讲稿

9、第十二页,共二十八页单一职责原则单一职责原则(SRP)软件设计真正要做的许多内容,就是发现职软件设计真正要做的许多内容,就是发现职责并把那些职责相互分离。责并把那些职责相互分离。就一个类而言,应该仅有一个引起它变化的就一个类而言,应该仅有一个引起它变化的原因。原因。合适的行为应该出现在合适的类里。合适的行为应该出现在合适的类里。本讲稿第十三页,共二十八页开闭原则开闭原则(OCP)一个模块在一个模块在扩展性扩展性方面应该是方面应该是开放开放的,而在的,而在更改性更改性方面应该是方面应该是封闭封闭的。的。设计模块的时候,应尽量使模块可扩展,且设计模块的时候,应尽量使模块可扩展,且扩展时不需要对模块

10、的源代码进行修改扩展时不需要对模块的源代码进行修改。本讲稿第十四页,共二十八页思考:思考:下图是一个针对不同打印机实现打印功能的类图设计,根据图中设计,如果现在需下图是一个针对不同打印机实现打印功能的类图设计,根据图中设计,如果现在需要添加一台要添加一台Legend打印机,需做哪些修改?打印机,需做哪些修改?上图设计并不合理,因为如果需要新加一台新的上图设计并不合理,因为如果需要新加一台新的Legend打印机的话,不但要增加打印机的话,不但要增加一个新的一个新的Legend类,还要修改类,还要修改Output类的内部结构。不符合开闭原则。类的内部结构。不符合开闭原则。那么,应该如何改进呢?那么

11、,应该如何改进呢?本讲稿第十五页,共二十八页 上图中引入了一个接口类上图中引入了一个接口类Printer,其中有一个,其中有一个print()方法。()方法。Output类只与这个接口类相关联,在类只与这个接口类相关联,在Output类中有一个类型为类中有一个类型为Printer的变量的变量p。不管系统与哪种打印机连接,实现打印功能时一律。不管系统与哪种打印机连接,实现打印功能时一律调用调用p.print()方法。而方法。而p的具体类型在运行是由系统确定,可能的具体类型在运行是由系统确定,可能是是HP类型的对象,也可能是类型的对象,也可能是Canon类型的对象。现在如果系统类型的对象。现在如果

12、系统需要加入需要加入Legend打印机,只需增加一个打印机,只需增加一个Legend类,并在该类类,并在该类中实现中实现Printer接口即可。因此,上图具有良好的可扩展性,符接口即可。因此,上图具有良好的可扩展性,符合开闭原则。合开闭原则。本讲稿第十六页,共二十八页Liskov替换原则替换原则(LSP)子类可以替换父类出现在父类能出现的任何地方子类可以替换父类出现在父类能出现的任何地方。如图:如图:ClassA要使用要使用ClassB,ClassC是是ClassB的子类。运行的子类。运行时,用时,用ClassC代替代替ClassB,ClassA仍然可以使用原来仍然可以使用原来ClassB中提

13、供的方法,而不需要做任何改动。中提供的方法,而不需要做任何改动。设计时应把设计时应把ClassB设计为抽象类或接口,让设计为抽象类或接口,让ClassC继承抽象类继承抽象类或实现接口。或实现接口。本讲稿第十七页,共二十八页例例根据鱼的种类,可以把鱼分为食肉的鱼和不食肉的鱼两种。其类图可根据鱼的种类,可以把鱼分为食肉的鱼和不食肉的鱼两种。其类图可表示如下:表示如下:问题来了,为了更好的区分鱼类,现在需要新添加一种问题来了,为了更好的区分鱼类,现在需要新添加一种分类方法,按照可上岸不可上岸来区分。该怎么办?分类方法,按照可上岸不可上岸来区分。该怎么办?鳄鱼是可以上岸的,让鳄鱼继承可上岸鱼。鳄鱼是可

14、以上岸的,让鳄鱼继承可上岸鱼。鳄鱼可以替换父类,完成可上岸鱼的所有行为。鳄鱼可以替换父类,完成可上岸鱼的所有行为。但是我们知道,鳄鱼也是食肉的,所以如果要让鳄鱼可以完成吃但是我们知道,鳄鱼也是食肉的,所以如果要让鳄鱼可以完成吃肉这个行为,必须在鳄鱼类里面定义一个吃肉方法。而这个方法肉这个行为,必须在鳄鱼类里面定义一个吃肉方法。而这个方法已经在食肉鱼类里面做过定义了。产生了已经在食肉鱼类里面做过定义了。产生了代码重复代码重复。本讲稿第十八页,共二十八页面向对象面向对象面向对象关注的是对象的行为,面向对象是面向对象关注的是对象的行为,面向对象是使用行为来对对象进行分类的!使用行为来对对象进行分类的

15、!在面向对象中子类能够替换父类(替换原则)在面向对象中子类能够替换父类(替换原则),是因为子类具有父类所有的属性和方法,是因为子类具有父类所有的属性和方法,同时子类还具有自己特有的元素。同时子类还具有自己特有的元素。本讲稿第十九页,共二十八页那么到底该怎么办呢?那么到底该怎么办呢?把对象的行为表示为接口。把对象的行为表示为接口。针对每一个具体的对象,只需让该对象实现所需要的接口针对每一个具体的对象,只需让该对象实现所需要的接口。publicinterface食肉publicinterface可上岸publicinterfaceXXXpublicclassCrocodileimplements食

16、肉,可上岸,XXX本讲稿第二十页,共二十八页依赖倒置原则依赖倒置原则(DIP)高层模块不应该依赖于低层模块,二者都应该依赖于抽象。抽象不应该依赖于实现细节,实现细节应该依赖于抽象。依赖倒置原则指依赖关系应该是尽量依赖接依赖倒置原则指依赖关系应该是尽量依赖接口或抽象类,而不是依赖于具体类。口或抽象类,而不是依赖于具体类。本讲稿第二十一页,共二十八页依赖倒置原则依赖倒置原则(DIP)越是低级的模块,越和具体细节有关,越高层的则越抽象,越是低级的模块,越和具体细节有关,越高层的则越抽象,但高层的模块往往是通过调用低层模块来实现的。也就是但高层的模块往往是通过调用低层模块来实现的。也就是说,说,抽象的

17、模块要依赖于与具体实现有关的模块,显然抽象的模块要依赖于与具体实现有关的模块,显然这是一种不好的依赖关系。这是一种不好的依赖关系。在结构化设计中(如下图),高层的模块依赖于低层的模块。在结构化设计中(如下图),高层的模块依赖于低层的模块。本讲稿第二十二页,共二十八页依赖倒置原则依赖倒置原则(DIP)在面向对象设计中,高层的类往往与业务有关,这些在面向对象设计中,高层的类往往与业务有关,这些类只依赖于一些抽象的类或者接口,而与具体实现有类只依赖于一些抽象的类或者接口,而与具体实现有关的类,也只与抽象类和接口有关联。当具体实现的关的类,也只与抽象类和接口有关联。当具体实现的细节改变的时候,不会对高

18、层的类产生影响。细节改变的时候,不会对高层的类产生影响。例如下图的设计:本讲稿第二十三页,共二十八页接口分离原则接口分离原则接口分离原则指的是在设计时采用多个与特定客户类有接口分离原则指的是在设计时采用多个与特定客户类有关的接口比采用一个通用接口更好。也就是说一个类如关的接口比采用一个通用接口更好。也就是说一个类如果要被多个客户类使用,那么可以给每一个客户类创建果要被多个客户类使用,那么可以给每一个客户类创建一个接口,同时这个类能够实现所有接口。而不要一个一个接口,同时这个类能够实现所有接口。而不要一个接口中包含了所有客户类需要的方法。接口中包含了所有客户类需要的方法。本讲稿第二十四页,共二十

19、八页下图设计是否合理?下图设计是否合理?如上图所示结构,如果Service接口中针对ClientA类的方法methodA()需要改变或者需要新添加一个methodD()那么ClientB和C都可能会受到影响,因此需要进行重新编译和发布。本讲稿第二十五页,共二十八页接口分离原则接口分离原则 设计接口的一个基本原则就是:设计接口的一个基本原则就是:只实现单一的功能。只实现单一的功能。接口代表一种功能,接口实现的功能太多了,就会引接口代表一种功能,接口实现的功能太多了,就会引起严重的耦合,这是一个设计上的大忌。起严重的耦合,这是一个设计上的大忌。上面例子应该如何修改以符合接口分离原则?本讲稿第二十六

20、页,共二十八页OO设计中的一些其他设计原则设计中的一些其他设计原则不同的类中相似方法的名字应该相同。不同的类中相似方法的名字应该相同。遵守已有的约定或习惯,以及开发机构规定的命名方法遵守已有的约定或习惯,以及开发机构规定的命名方法。尽量减少消息模式的数目尽量减少消息模式的数目。只要可能,就要让消息具。只要可能,就要让消息具有一致的模式。例如,不要在一个消息中,第一个参数有一致的模式。例如,不要在一个消息中,第一个参数表示发送者的表示发送者的ip地址,而在另一个消息中,第一个参数地址,而在另一个消息中,第一个参数表示接收者的表示接收者的ip。类的设计要尽可能简单,易于理解类的设计要尽可能简单,易

21、于理解。类的泛化不宜太深类的泛化不宜太深。类之间的泛化一定程度上增加。类之间的泛化一定程度上增加了类之间的耦合,除非特殊情况,否则不要设计很深了类之间的耦合,除非特殊情况,否则不要设计很深层次的泛化关系。层次的泛化关系。定义简单的方法。定义简单的方法。一个类的方法不应太复杂。如果一个一个类的方法不应太复杂。如果一个方法太大,则可以尝试对其进行细分。方法太大,则可以尝试对其进行细分。本讲稿第二十七页,共二十八页思考题思考题图图1:图图2图图1 1中中Class4Class4同时被同时被Class1Class1,2 2,3 3调用,调用,是一种不好的设计,是一种不好的设计,应该怎样改进?应该怎样改进?图图2 2增加了接口增加了接口1 1、2 2、3 3,而,而原先原先的的Class4Class4从这三个接口中继承从这三个接口中继承。重构后带来了一个好处,重构后带来了一个好处,即将即将类类4 4和类和类1 1、2 2、3 3解耦解耦。未来,如果需求发生变化,觉未来,如果需求发生变化,觉得类得类4 4过于庞大和复杂,可以过于庞大和复杂,可以将类将类4 4重写或分拆。而类重写或分拆。而类1 1、2 2、3 3对此将一无所知。对此将一无所知。本讲稿第二十八页,共二十八页

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 大学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁