面向对象设计中的五大原则电子教案

上传人:youn****329 文档编号:143321388 上传时间:2020-08-28 格式:PPT 页数:23 大小:628.50KB
返回 下载 相关 举报
面向对象设计中的五大原则电子教案_第1页
第1页 / 共23页
面向对象设计中的五大原则电子教案_第2页
第2页 / 共23页
面向对象设计中的五大原则电子教案_第3页
第3页 / 共23页
面向对象设计中的五大原则电子教案_第4页
第4页 / 共23页
面向对象设计中的五大原则电子教案_第5页
第5页 / 共23页
点击查看更多>>
资源描述

《面向对象设计中的五大原则电子教案》由会员分享,可在线阅读,更多相关《面向对象设计中的五大原则电子教案(23页珍藏版)》请在金锄头文库上搜索。

1、在本单元重点了解如下知识点 单一职责原则(SRP) 接口隔离原则(ISP) 依赖倒置原则(DIP) 开放-封闭”原则(OCP) Liskov替换原则(LSP),如何正确地进行类的设计 遵守面向对象设计中的“五大原则”,面向对象设计和编程概述,1、面向对象设计(OOD)和面向对象编程语言(OOPL) Object-Oriented Programming Language可以提高程序的封装性、复用性、可维护性,但仅仅是“可以”。,让我们开始涉猎软件系统设计的思想、原则和模式方面的内容 Robert C.Martin在敏捷软件开发原则、方法与实践一书中总结出了“单一职责原则”。 让我们先从“单一职

2、责原则”开始吧,2、能不能真正实现OOD和OOPL所体现出的这些“优点”? 取决于设计和编程人员具体“如何做”。,3、那么如何能够达到如此“境界”? 有什么设计思想、设计原则和设计模式吗?,1、什么是SRP(Single-Responsibility Principle) 一个类应该仅有一个引起它的变化的原因(职责),这条原则也称为类设计的“高内聚性原则”。,少管闲事,专心做一件事情!“一心无二用”!,它指导我们如何提高代码的可重用度!,你认为该JSP页面有什么问题吗?,单一职责原则,(l)含义之一 避免相同的职责(也称为功能)分散到不同的类中实现,(2)含义之二 也应该要避免一个类承担过多的

3、职责。,上面的图示表示,在系统的持久层的设计中,将实现数据库连接和数据库访问操作相互分离;由两种不同形式的类承担。 而如果将它们耦合在一起(数据库连接、数据库CRUD操作和数据库连接释放等),将导致“数据连接”的职责在被重用时,将出现问题!拔出萝卜带出泥!,3、遵守单一职责原则的各种GOF设计模式,类的设计主要工作是“发现职责”并“分离职责”!,(2)模板方法模式的应用,(1)工厂模式的应用 分离对象的“创建”和对象的“使用”方面的职责。,分离 “共性功能实现”和“个性扩展”方面的职责。,(3)命令模式的应用 分离“命令的请求者”和“命令的实现者”方面的职责。,(4)代理模式的应用 分离 “服

4、务的请求者”和“服务的提供者”各自方面的职责; 应用业务代理类的主要的目的是降低客户端与业务组件之间的紧密关联性和提高业务功能组件类的安全性。,希望大家掌握对这些基本的模式的具体应用!,4、遵守单一职责原则的系统架构设计 (1)单一职责原则不只是对类设计有意义,对以模块、子系统为单位的系统架构设计同样也有意义 一个模块、子系统也应该仅有一个引起它变化的原因,如MVC所倡导的各个层之间的相互分离其实就是单一职责原则在系统总体设计中的应用。,(2)Struts2框架中应用代理模式的示例,1、接口隔离原则(ISP)的具体体现 (1)一个类对另外一个类的依赖性应当是建立在最小的接口上 ISP可以达到不

5、强迫客户(接口的使用方)依赖于他们不用的方法在接口设计中应该保证,接口的实现类应该只呈现为单一职责的角色(遵守SRP原则); ISP还可以降低客户之间的相互影响当某个客户程序要求提供新的职责(需求变化)而迫使接口发生改变时,影响到其他客户程序的可能性会最小。,它指导我们如何正确地进行接口设计!,接口隔离原则,(2)客户端程序不应该依赖它不需要的接口方法(功能) 比如在应用继承时,由于子类将继承父类中的所有可用的方法;而父类中的某些方法,在子类中可能并不需要,但也将被父类强迫使用?! 因此,谨用继承!,2、对接口的污染(过于臃肿的接口设计是对接口的污染) (l)接口的污染(Interface C

6、ontamination) 一个没有经验的设计师往往想节省接口的数目,将一些功能相近或功能相关的接口合并。,(2)所谓接口污染就是为接口添加了不必要的职责 如果开发人员在接口中增加一个新的功能方法的主要目的只是为了减少接口的实现类的数目,如此设计将导致接口被不断地“污染”并“变胖”。,(3)软件系统中类的设计是否合理不在乎类本身的数目 接口污染会给系统带来维护和重用等方面的问题。 为了能够重用被污染的接口,接口的实现类就被迫要实现并维护不必要的功能方法。,3、如何避免不良好的设计 (1)每个具体的功能实现类都应该对应有一个专用的接口 因为接口隔离原则其实是单一职责应用于接口设计上的细化准侧,请

7、参考如下的示例:,(2)“接口隔离”其实就是定制化服务设计的原则,(3) 使用接口的多重继承实现对不同的接口的组合,从而对外提供组合功能达到“按需提供服务”。,4、如何改进“胖接口”的设计结果 如果现有的系统已经设计成胖接口,可以使用适配器模式隔离它。如下示例:,5、为什么要遵守接口隔离原则可以获得更灵活的设计,1、依赖倒置 (1)什么是依赖倒置-将依赖关系倒置为依赖接口,它指导我们如何正确地消解模块间的依赖关系!同时它也是框架设计的核心原则,上层模块不应该依赖于下层模块,它们共同依赖于一个抽象(父类不能依赖子类,它们都要依赖抽象类)。 抽象不能依赖于具体,具体应该要依赖于抽象,依赖倒置原则(

8、Dependency Inversion Principle ),(2)如何消解两个模块间的依赖关系 应该在两个模块之间定义一个抽象接口,上层模块调用抽象接口中定义的方法,下层模块实现该接口的方法。,(3)为什么要依赖接口 因为接口体现对问题的抽象,同时由于抽象一般是相对稳定的或者是相对变化不频繁的,而具体是易变的。 因此,依赖抽象是实现代码扩展和运行期内绑定(多态)的基础只要实现了该抽象类的子类,都可以被类的使用者使用,2、如何满足DIP:面向接口编程,(1)每个较高层次类都为它所需要的服务提出一个接口声明,较低层次类实现这个接口。 (2)每个高层类都通过该抽象接口使用服务。,以前传统的过程

9、设计中是从上到下的一条依赖,满足DIP的设计方案,3、对系统设计的要求 (1)在进行业务设计时 应尽量在接口或抽象类中定义业务方法的原型(功能要求),通过具体的实现类(或者子类)来实现该业务方法。,(2)这样的设计方案的主要优点体现 在对业务方法的具体实现进行修改时,将不会影响到运行时对该业务方法的调用者的程序。,1、什么是OCP (Open-Close Principle)原则 随着软件系统的规模不断地增大,从而对软件系统的维护和修改带来新的复杂性,这种困境促使法国工程院院士Bertrand Meyer在1998年提出了“开放-封闭”原则,这条原则的基本思想是:,它指导我们如何提高代码的可扩

10、展性!,开放封闭原则,换句话说,也就是要求开发人员可以在不修改系统中现有的功能代码(源代码或者二进制代码、模块的二进制可执行版本,无论是可链接的库、DLL或者Java的.jar文件)的前提下,而实现对应用系统的软件功能进行扩展。这能够做到吗?,(1)Open(Open for extension) 模块的行为必须是开放的、支持扩展的,而不是僵化的。 (2)Closed(Closed for modification) 在对模块的功能进行扩展时,不应该影响或大规模地影响已有的程序模块。,3、为什么要遵守“开放-封闭”原则 其目的是能够提高系统的可扩展性和可维护性。 4、如何遵守“开放-封闭”原则

11、 (1)在设计方面充分应用“抽象”和“封装”的思想 一方面也就是要在软件系统中找出各种可能的“可变因素”,并将之封装起来; 另一方面,一种可变性因素不应当散落在多个不同代码模块中,而应当被封装到一个对象中。,你应该了解OO中的“封装”特性!,2、以生活中的示例来说明OCP原则的基本思想 (1)PC电脑功能扩展方式 (2)添加“机顶盒”实现将“模拟电视”扩展为“数字电视”,(2)在系统功能编程实现方面应用面向接口编程 当需求发生变化时,可以提供该接口的新的实现类,以求适应变化。 面向接口编程要求功能类实现接口、对象声明为接口类型。,1、Liskov替换原则(LSP-The The Liskov

12、Substitution Principle)的定义和主要的思想 子类型必须能够替换掉它们的父类型、并出现在父类能够出现的任何地方。,它指导我们如何正确地进行继承与派生,并合理地重用代码!,Liskov替换原则,3、我们应该要思考如下的一些问题 (1)如何正确地进行继承方面的设计? (2)最佳的继承层次如何获得? (3 )怎样避免所设计的类层次陷入不符合OCP原则的状况?,2、LSP主要是针对继承的设计原则 因为继承与派生是OOP的一个主要特性,能够减少代码的重复编程实现,从而实现系统中的代码复用!但如何正确地进行继承设计和合理地应用继承机制呢?,继承与派生有哪些优缺点?,我们必须要有原则的指

13、导,Liskov替换原则被提出,4、如何遵守该设计原则 (1)父类的方法都要在子类中实现或者重写,并且派生类只实现其抽象类中声明的方法,而不应当给出多余的方法定义或实现。,(2)在客户端程序中只应该使用父类对象而不应当直接使用子类对象,这样将可以实现运行期绑定(动态多态)。,5、代码示例,6、不遵守Liskov替换原则的示例 总结:一个系统或子系统要拥有良好的扩展性和实现运行期内绑定(可互换性),有两个必要条件,并且这两个条件缺一不可。 第一是依赖倒置原则-面向接口编程实现类; 第二是李氏替换原则-正确地进行继承关系的设计,7、子类如何“个性化”自己的功能实现 (1)应该采用在子类中重写基类的

14、方法的实现形式,而不是采用新增新的方法的实现形式 (2)代码示例,为了能够真正理解前面的“五个基本原则”,现在我们通过示例学习如何在实际的编程中应用面向对象设计中的五大原则。,该示例应用的场景 利用JDBC编程实现数据库连接。,1、从面向对象的角度来看类之间一般会存在如下关系关联(Association)、依赖(Dependency)、聚合(Aggregation)、组合(Composition)、泛化(Generalization),类之间的各种可能的关系,2、设计人员如何致力于降低类之间关系的藕合度 (1)分离系统中各个模块类的接口定义和接口的具体功能实现,(3)尽可能针对抽象编程而不针对具体子类编程 (4)应用控制反转(IoC)设计模式 (5)应用依赖注入(DI)技术,(2)利用接口类型的对象作为各个层之间或者两个类之间的连接点,

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

当前位置:首页 > 中学教育 > 教学课件 > 高中课件

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