面向对象设计原则_第1页
面向对象设计原则_第2页
面向对象设计原则_第3页
面向对象设计原则_第4页
面向对象设计原则_第5页
已阅读5页,还剩56页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、s2面向对象设计原则内容单一职责原则里氏替换原则依赖倒置原则接口隔离原则迪米特法则开闭原则单一职责原则单一职责原则的英文名称是SingleResponsibility Principle,简称是SRP接口负责单一的职责单一职责原则单一职责原则单一职责原则单一职责原则类的复杂性降低,实现什么职责都有清晰明确的定义可读性提高,复杂性降低;可维护性提高变更引起的风险降低,一个接口修改只对相应的实现类有影响,对其他的接口无影响单一职责原则提出了一个编写程序的标准,用“职责”或“变化原因”来衡量接口或类设计得是否优良思考班长管理班里所有的工作,因为临近考试,学习压力比较大,班长希望能减轻一下自己的工作压

2、力,如何实现。MonitorIMonitor+manageStudy()+manageLife()+manageSport()参考实现SportManagerLiftManagerStudyManager ISportManager+manageSport() ILifeManager+manageLife() ISutdeyManager+manageStudy()参考实现MonitorIMonitor+meeting()+report()继承的例子AbstractCat现在增加一个抽象方法shape,子类需要修改吗?Petcat+dress()WildcatAbstractCat+skil

3、l()+sleep()+eat()思考下面哪些语句是正确的,为什么? Petcat petcat = new Petcat (); AbstractCat cat = new AbstractCat (); AbstractCat cat = new Petcat (); Petcat petcat = new AbstractCat (); (AbstractCat)new Petcat().dress(); (AbstractCat)new Petcat().sleep();继承的例子BaseCat 和AbstractCat的区别?Petcat+dress()WildcatBaseCat+

4、skill()+sleep()+eat()思考下面哪些语句是正确的,为什么? Petcat petcat = new Petcat (); BaseCat cat = new BaseCat (); BaseCat cat = new Petcat (); Petcat petcat = new BaseCat (); (BaseCat)new Petcat().dress(); (BaseCat)new Petcat().sleep();里氏替换继承的特点减少创建类的工作量,每个子类都拥有父类的方法和属性;提高代码的复用性;提高代码的可扩展性,子类继承父类来的同时可以扩展自己的行为继承是侵入

5、性的。只要继承,就必须拥有父类的所有属性和方法强耦合性。当父类的常量、变量和方法被修改时,需要考虑子类的修改,而且在缺乏规范的环境下,这种修改可能导致大量的代码重构。里氏替换里氏替换原则:如果对每一个类型为S的对象o1,都有类型为T的对象o2,使得以T定义的所有程序P在所有的对象o1都代换成o2时,程序P的行为没有发生变化,那么类型S是类型T的子类型。所有引用父类的地方必须能透明地使用其子类的对象。只要父类能出现的地方子类就可以出现,而且替换为子类也不会产生任何错误或异常,使用者可能根本就不需要知道是父类还是子类。但是,有子类出现的地方,父类未必就能适应。理解里氏替换示例理解里氏替换示例理解里

6、氏替换下面的输出结果是什么?是否违反里氏替换原则?理解里氏替换下面的输出结果是什么?是否违反里氏替换原则?理解里氏替换理解里氏替换理解里氏替换下面程序是否正确?是否违背里氏替换原则?里氏替换覆盖或实现父类的方法时输入参数可以被放大父类方法的输入参数是HashMap类型,子类的输入参数是Map 类型,也就是说子类的输入参数类型的范围扩大了,子类代替父类传递到调用者中,子类的方法永远都不会被执行。里氏替换覆写或实现父类的方法时输出结果可以被缩小父类的一个方法的返回值是一个类型T,子类的相同方法(重载或覆写)的返回值为S,那么里氏替换原则就要求S必须小于等于T,也就是说,要么S和T是同一个类型,要么

7、S是T的子类理解里氏替换里氏替换原则子类可以实现父类的抽象方法,但是不能覆盖父类的非抽象方法。子类中可以增加自己特有的方法。覆盖或实现父类的方法时输入参数可以被放大覆写或实现父类的方法时输出结果可以被缩小里氏替换采用里氏替换原则的目的就是增强程序的健壮性,版本升级时也可以保持非常好的兼容性。即使增加子类,原有的子类还可以继续运行。在实际项目中,每个子类对应不同的业务含义,使用父类作为参数,传递不同的子类完成不同的业务逻辑,非常完美!依赖倒置依赖倒置的含义高层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。依赖倒置依赖倒置在Java中的表现模块间的依赖通过抽象

8、发生,实现类之间不发生直接的依赖关系,其依赖关系是通过接口或抽象类产生的;接口或抽象类不依赖于实现类;实现类依赖接口或抽象类。理解依赖倒置依赖倒置依赖倒置原则可以减少类间的耦合性,提高系统的稳定性,降低并行开发引起的风险,提高代码的可读性和可维护性。练习根据依赖倒置原则进行修改Student+study(English english)+study(Math math)+study(Chinese chinese)EnglishMath+content()+content()Chinese+content()依赖倒置总结依赖“正置”就是类间的依赖是实实在在的实现类间的依赖,也就是面向实现编程,

9、这也是正常人的思维方式,我要开奔驰车就依赖奔驰车,我要使用笔记本电脑就直接依赖笔记本电脑,而编写程序需要的是对现实世界的事物进行抽象,抽象的结果就是有了抽象类和接口,然后我们根据系统设计的需要产生了抽象间的依赖,代替了人们传统思维中的事物间的依赖,“倒置”就是从这里产生的。依赖倒置总结每个类尽量都有接口或抽象类,或者抽象类和接口两者都具备变量的表面类型尽量是接口或者是抽象类任何类都不应该从具体类派生尽量不要覆写基类的方法结合里氏替换原则使用接口隔离客户端不应该依赖它不需要的接口类间的依赖关系应该建立在最小的接口上。建立单一接口,不要建立臃肿庞大的接口。接口尽量细化,同时接口中的方法尽量少。接口

10、隔离示例修改前接口隔离示例修改后接口隔离含义接口要尽量小:不出现臃肿的接口,根据接口隔离原则拆分接口时,首先必须满足单一职责原则。接口隔离含义接口要高内聚:高内聚就是提高接口、类、模块的处理能力,减少对外的交互。在接口中尽量少公布public方法,接口是对外的承诺,承诺越少对系统的开发越有利,变更的风险也就越少,同时也有利于降低成本。接口隔离含义定务:定务就是单独为一个个体提供优良的服务。我们在做系统设计时也需要考虑对系统之间或模块之间的接口采用定务。采用定务就必然有一个要求:只提供访问者需要的方法定务示例定务示例接口隔离含义接口设计是有限度的:接口的设计粒度越小,系统越灵活,这是不争的事实。

11、但是,灵活的同时也带来了结构的复杂化,开发难度增加,可维护性降低,这不是一个项目或产品所期望看到的, 所以接口设计一定要注意适度,这个“度”如何来判断呢?根据经验和常识判断,没有一个固化或可测量的标准。接口隔离练习PetcatWildcat ICat+catchMouse()+clumbTree()+miao()+dress()接口隔离练习WildcatPetcat IPetcat+dress() IWildcat+catchMouse()+clumbTree() ICat+miao()迪米特法则迪米特法则(Law of Demeter,LoD)也称为最少知识原则(Least Knowledg

12、e Principle,LKP):一个对象应该对其他对象有最少的了解。通俗地讲,一个类应该对自己需要耦合或调用的类知道得最少, 被调用(耦合)的类的内部是如何复杂都和调用(耦合)者没 关系只与直接的朋友通信。示例示例修改后迪米特法则练习测试工程师:小郑市场部:小吴开发工程师:小周项目经理:小赵测试工程师:小王HR考勤:小钱迪米特法则练习技术部工程师:小周项目经理:小赵技术部接口人:小孙市场部:小吴测试部:小郑测试部:小王HR考勤:小钱开闭原则一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。软件实体应该对扩展开放,对修改关闭,其含义是说一个软件实体应该通过扩展来实现变化,而不是通过修改已

13、有的代码来实现变化。开闭原则开闭原则书店系统需求变更: 全球经济开始下滑,对零售业影响比较大,书店为了生存开始打折销售:所有40元以上的书籍9折销售,其他的8折销售开闭原则修改方式: 修改接口:在IBook上新增加一个方法getOffPrice(), 专门用于进行打折处理,所有的实现类实现该方法。 修改实现类:修改NovelBook类中的方法,直接在getPrice()中实现打折处理,好办法,通过class文件 替换的方式可以完成部分业务变化(或是缺陷修复)。开闭原则通过扩展实现变化增加一个子类OffNovelBook,覆写getPrice方法,高层 次的模块(也就是static静态模块区)通OffNovelBook 类产生新的对象,完成业务变化对系统的最小化开发。好办法,修改也少,风险也小。开闭原则开闭原则开闭原则对测试的影响原有的健壮代码不修改,仅仅通过扩展实现变化开闭原则可以提高复用性所有的逻辑都是从原子逻辑组合而来的,而不是在一个类中独立实现一个业务逻辑。只有这样代码才可以复用,粒度越小,被复用的可能

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论