02 C_设计模式-面向对象设计原则.ppt

上传人:asd****56 文档编号:93475566 上传时间:2023-07-06 格式:PPT 页数:41 大小:2.09MB
返回 下载 相关 举报
02 C_设计模式-面向对象设计原则.ppt_第1页
第1页 / 共41页
02 C_设计模式-面向对象设计原则.ppt_第2页
第2页 / 共41页
点击查看更多>>
资源描述

《02 C_设计模式-面向对象设计原则.ppt》由会员分享,可在线阅读,更多相关《02 C_设计模式-面向对象设计原则.ppt(41页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、www.ChinaSA.infoDDesign esign PPatternsatterns面向对象设计原则面向对象设计原则刘 伟(Sunny)weiliu_www.ChinaSA.info大纲w 面向对象设计原则概述w 单一职责原则w 开闭原则w 里氏代换原则w 依赖倒转原则w 接口隔离原则w 合成复用原则w 迪米特法则www.ChinaSA.info面向对象设计原则概述w 可维护性(Maintainability):指软件能够被理解、改正、适应及扩展的难易程度w 可复用性(Reusability):指软件能够被重复使用的难易程度w 面向对象设计的目标之一在于支持可维护性复用,一方面需要实现

2、设计方案或者源代码的复用,另一方面要确保系统能够易于扩展和修改,具有良好的可维护性www.ChinaSA.info面向对象设计原则概述w 面向对象设计原则为支持可维护性复用而诞生w 指导性原则,非强制性原则w 每一个设计模式都符合一个或多个面向对象设计原则,面向对象设计原则是用于评价一个设计模式的使用效果的重要指标之一www.ChinaSA.info面向对象设计原则概述设计原则名称 定 义 使用频率单一职责原则(Single Responsibility Principle,SRP)一 个 对 象 应 该 只 包 含 单 一 的 职 责,并 且 该 职 责 被完整地封装在一个类中开闭原则(Op

3、en-Closed Principle,OCP)软件实体应当对扩展开放,对修改关闭 里氏代换原则(Liskov Substitution Principle,LSP)所 有 引 用 基 类 的 地 方 必 须 能 透 明 地 使 用 其 子 类 的对象依赖倒转原则(Dependence Inversion Principle,DIP)高层模块不应该依赖低层模块,它们都应该依赖抽象。抽象不应该依赖于细节,细节应该依赖于抽象接口隔离原则(Interface Segregation Principle,ISP)客户端不应该依赖那些它不需要的接口 合成复用原则(Composite Reuse Prin

4、ciple,CRP)优 先 使 用 对 象 组 合,而 不 是 继 承 来 达 到 复 用 的 目的迪米特法则(Law of Demeter,LoD)每 一 个 软 件 单 位 对 其 他 的 单 位 都 只 有 最 少 的 知 识,而且局限于那些与本单位密切相关的软件单位www.ChinaSA.info单一职责原则 w 单一职责原则定义 单一职责原则是最简单的面向对象设计原则,用于控制类的粒度大小单一职责原则:一个对象应该只包含单一的职责,并且该职责被完整地封装在一个类中。Single Responsibility Principle(SRP):Every object should hav

5、e a single responsibility,and that responsibility should be entirely encapsulated by the class.www.ChinaSA.info单一职责原则 w 单一职责原则定义 就一个类而言,应该仅有一个引起它变化的原因There should never be more than one reason for a class to change.www.ChinaSA.info单一职责原则 w 单一职责原则分析 一个类(大到模块,小到方法)承担的职责越多,它被复用的可能性就越小 当一个职责变化时,可能会影响其他职

6、责的运作 将这些职责进行分离,将不同的职责封装在不同的类中 将不同的变化原因封装在不同的类中 单一职责原则是实现高内聚、低耦合的指导方针www.ChinaSA.info单一职责原则 w 单一职责原则实例 实例说明某 软 件 公 司 开 发 人 员 针 对CRM(Customer Relationship Management,客 户关 系 管 理)系 统 中 的 客 户 信 息 图 表 统 计 模 块 提 出 了 如 图2-1 所 示 的 初 始 设 计 方案。图2-1 初始设计方案结构图在 图2-1 中,GetConnection()方 法 用 于 连 接 数 据 库,FindCustome

7、rs()用 于 查询所有的客户信息,CreateChart()用于创建图表,DisplayChart()用于显示图表。现使用单一职责原则对其进行重构。www.ChinaSA.info单一职责原则 w 单一职责原则实例 实例解析 www.ChinaSA.info开闭原则w 开闭原则定义 开闭原则是面向对象的可复用设计的第一块基石,是最重要的面向对象设计原则开闭原则:软件实体应当对扩展开放,对修改关闭。Open-Closed Principle(OCP):Software entities should be open for extension,but closed for modificati

8、on.www.ChinaSA.info开闭原则w 开闭原则分析 开闭原则由Bertrand Meyer 于1988 年提出 在开闭原则的定义中,软件实体可以是一个软件模块、一个由多个类组成的局部结构或一个独立的类 开闭原则是指软件实体应尽量在不修改原有代码的情况下进行扩展www.ChinaSA.info开闭原则w 开闭原则分析 抽象化是开闭原则的关键 相对稳定的抽象层+灵活的具体层 对可变性封装原则(Principle of Encapsulation of Variation,EVP):找到系统的可变因素并将其封装起来www.ChinaSA.info里氏代换原则w 里氏代换原则定义 里氏代换

9、原则:如果对每一个类型为S 的对象o1,都有类型为T 的对象o2,使得以T 定义的所有程序P 在所有的对象o1都代换o2时,程序P 的行为没有变化,那么类型S 是类型T 的子类型。Liskov Substitution Principle(LSP):If for each object o1 of type S there is an object o2 of type T such that for all programs P defined in terms of T,the behavior of P is unchanged when o1 is substituted for o2

10、 then S is a subtype of T.里氏代换原则:所有引用基类的地方必须能透明地使用其子类的对象。Liskov Substitution Principle(LSP):Functions that use pointers or references to base classes must be able to use objects of derived classes without knowing it.www.ChinaSA.info里氏代换原则 w 里氏代换原则分析 里氏代换原则由2008 年图灵奖得主、美国第一位计算机科学女博士、麻省理工学院教授Barbara L

11、iskov 和卡内基.梅隆大学Jeannette Wing 教授于1994 年提出芭芭拉 利斯科夫(Barbara Liskov),美国计算机科学家,2008 年图灵奖得主,2004 年约翰.冯诺依曼奖得主,美国工程院院士,美国艺术与科学院院士,美国计算机协会会士。现任麻省理工学院电子电气与计算机科学系教授,她是美国第一个计算机科学女博士。www.ChinaSA.info里氏代换原则 w 里氏代换原则分析 在软件中将一个基类对象替换成它的子类对象,程序将不会产生任何错误和异常,反过来则不成立。如果一个软件实体使用的是一个子类对象的话,那么它不一定能够使用基类对象 在程序中尽量使用基类类型来对对

12、象进行定义,而在运行时再确定其子类类型我喜欢动物 我喜欢狗 因为狗是动物 www.ChinaSA.info依赖倒转原则 w 依赖倒转原则定义依赖倒转原则:高层模块不应该依赖低层模块,它们都应该依赖抽象。抽象不应该依赖于细节,细节应该依赖于抽象。Dependency Inversion Principle(DIP):High level modules should not depend upon low level modules,both should depend upon abstractions.Abstractions should not depend upon details,d

13、etails should depend upon abstractions.www.ChinaSA.info依赖倒转原则 w 依赖倒转原则定义 要针对接口编程,不要针对实现编程Program to an interface,not an implementation.www.ChinaSA.info依赖倒转原则 w 依赖倒转原则分析 依赖倒转原则是Robert C.Martin 在1996 年为“C+Reporter”所写的专栏Engineering Notebook 的第三篇,后来加入到他在2002 年出版的经典著作Agile Software Development,Principles

14、,Patterns,and Practices 一书中www.ChinaSA.info依赖倒转原则 w 依赖倒转原则分析 在程序代码中传递参数时或在关联关系中,尽量引用层次高的抽象层类,即使用接口和抽象类进行变量类型声明、参数类型声明、方法返回类型声明,以及数据类型的转换等 在程序中尽量使用抽象层进行编程,而将具体类写在配置文件中www.ChinaSA.info依赖倒转原则 w 依赖倒转原则分析 针对抽象层编程,将具体类的对象通过依赖注入(Dependency Injection,DI)的方式注入到其他对象 构造注入 设值注入(Setter 注入)接口注入www.ChinaSA.info依赖倒

15、转原则w OCP/LSP/DIP 综合实例 实例说明某 软 件 公 司 开 发 人 员 在 开 发CRM 系 统 时 发 现:该 系 统 经 常 需 要 将 存 储 在TXT 或Excel 文 件 中 的 客 户 信 息 转 存 到 数 据 库 中,因 此 需 要 进 行 数 据 格 式 转换。在 客 户 数 据 操 作 类CustomerDAO 中 将 调 用 数 据 格 式 转 换 类 的 方 法 来 实现格式转换,初始设计方案结构如图2-3 所示:图2-3 初始设计方案结构图在 编 码 实 现 图2-3 所 示 结 构 时,该 软 件 公 司 开 发 人 员 发 现 该 设 计 方 案

16、存 在一 个 非 常 严 重 的 问 题,由 于 每 次 转 换 数 据 时 数 据 来 源 不 一 定 相 同,因 此 需要 经 常 更 换 数 据 转 换 类,例 如 有 时 候 需 要 将 TXTDataConvertor 改 为ExcelDataConvertor,此 时,需 要 修 改CustomerDAO 的 源 代 码,而 且 在 引 入并 使 用 新 的 数 据 转 换 类 时 也 不 得 不 修 改CustomerDAO 的 源 代 码,系 统 扩 展性较差,违反了开闭原则,需要对该方案进行重构。www.ChinaSA.info依赖倒转原则w OCP/LSP/DIP 综合实例

17、 实例解析 www.ChinaSA.info接口隔离原则w 接口隔离原则定义接口隔离原则:客户端不应该依赖那些它不需要的接口。Interface Segregation Principle(ISP):Clients should not be forced to depend upon interfaces that they do not use.www.ChinaSA.info接口隔离原则w 接口隔离原则分析 当一个接口太大时,需要将它分割成一些更细小的接口 使用该接口的客户端仅需知道与之相关的方法即可 每一个接口应该承担一种相对独立的角色,不干不该干的事,该干的事都要干www.China

18、SA.info接口隔离原则w 接口隔离原则分析“接口”定义(1):一个类型所提供的所有方法特征的集合。一个接口代表一个角色,每个角色都有它特定的一个接口,“角色隔离原则”“接口”定义(2):狭义的特定语言的接口。接口仅仅提供客户端需要的行为,客户端不需要的行为则隐藏起来,应当为客户端提供尽可能小的单独的接口,而不要提供大的总接口,每个接口中只包含一个客户端所需的方法,“定制服务”www.ChinaSA.info接口隔离原则w 接口隔离原则实例 实例说明 某 软 件 公 司 开 发 人 员 针 对CRM 系 统 的 客 户 数 据 显 示 模 块 设 计 了 如 图2-5 所 示接 口,其 中

19、方 法DataRead()用 于 从 文 件 中 读 取 数 据,方 法TransformToXML()用 于 将 数 据 转 换 成XML 格 式,方 法CreateChart()用 于 创 建 图 表,方 法DisplayChart()用 于 显 示 图 表,方 法CreateReport()用 于 创 建 文 字 报 表,方 法DisplayReport()用于显示文字报表。图2-5 初始设计方案结构图在 实 际 使 用 过 程 中 开 发 人 员 发 现 该 接 口 很 不 灵 活,例 如:如 果 一 个 具 体 的数 据 显 示 类 无 须 进 行 数 据 转 换(源 文 件 本 身

20、 就 是XML 格 式),但 由 于 实 现 了该 接 口,不 得 不 实 现 其 中 声 明 的TransformToXML()方 法(至 少 需 要 提 供 一 个空 实 现);如 果 需 要 创 建 和 显 示 图 表,除 了 需 要 实 现 与 图 表 相 关 的 方 法 外,还需要实现创建和显示文字报表的方法,否则程序在编译时将报错。现使用接口隔离原则对其进行重构。www.ChinaSA.info接口隔离原则w 接口隔离原则实例 实例解析 www.ChinaSA.info合成复用原则w 合成复用原则定义 合成复用原则又称为组合/聚合复用原则(Composition/Aggregate

21、 Reuse Principle,CARP)合成复用原则:优先使用对象组合,而不是继承来达到复用的目的。Composite Reuse Principle(CRP):Favor composition of objects over inheritance as a reuse mechanism.www.ChinaSA.info合成复用原则w 合成复用原则分析 合成复用原则就是在一个新的对象里通过关联关系(包括组合关系和聚合关系)来使用一些已有的对象,使之成为新对象的一部分 新对象通过委派调用已有对象的方法达到复用功能的目的 复用时要尽量使用组合/聚合关系(关联关系),少用继承www.Chi

22、naSA.info合成复用原则w 合成复用原则分析 继承复用:实现简单,易于扩展。破坏系统的封装性;从基类继承而来的实现是静态的,不可能在运行时发生改变,没有足够的灵活性;只能在有限的环境中使用。(“白箱”复用)组合/聚合复用:耦合度相对较低,有选择性地调用成员对象的操作;可以在运行时动态进行,新对象可以动态地引用与成员对象类型相同的其他对象。(“黑箱”复用)www.ChinaSA.info合成复用原则w 合成复用原则实例 实例说明某 软 件 公 司 开 发 人 员 在 初 期 的CRM 系 统 设 计 中,考 虑 到 客 户 数 量 不 多,系统 采 用Access 作 为 数 据 库,与

23、数 据 库 操 作 有 关 的 类,例 如CustomerDAO 类 等 都需 要 连 接 数 据 库,连 接 数 据 库 的 方 法GetConnection()封 装 在DBUtil 类 中,由 于需 要 重 用 DBUtil 类 的 GetConnection()方 法,设 计 人 员 将 CustomerDAO 作 为DBUtil 类的子类,初始设计方案结构如图2-7 所示。图2-7 初始设计方案结构图随 着 客 户 数 量 的 增 加,系 统 决 定 升 级 为Oracle 数 据 库,因 此 需 要 增 加 一 个 新的OracleDBUtil 类 来 连 接Oracle 数 据

24、库,由 于 在 初 始 设 计 方 案 中CustomerDAO和 DBUtil 之 间 是 继 承 关 系,因 此 在 更 换 数 据 库 连 接 方 式 时 需 要 修 改CustomerDAO 类 的 源 代 码,将CustomerDAO 作 为OracleDBUtil 的 子 类,这 将 违背 开 闭 原 则。当 然 也 可 以 直 接 修 改DBUtil 类 的 源 代 码,这 同 样 也 违 背 了 开 闭 原则。现使用合成复用原则对其进行重构。www.ChinaSA.info合成复用原则w 合成复用原则实例 实例解析 www.ChinaSA.info迪米特法则 w 迪米特法则定义

25、 迪米特法则又称为最少知识原则(Least Knowledge Principle,LKP)迪米特法则:每一个软件单位对其他的单位都只有最少的知识,而且局限于那些与本单位密切相关的软件单位。Law of Demeter(LoD):Each unit should have only limited knowledge about other units:only units closely related to the current unit.www.ChinaSA.info迪米特法则 w 迪米特法则分析 迪米特法则来自于1987 年美国东北大学(Northeastern Universit

26、y)一个名为“Demeter”的研究项目 迪米特法则要求一个软件实体应当尽可能少地与其他实体发生相互作用 应用迪米特法则可降低系统的耦合度,使类与类之间保持松散的耦合关系www.ChinaSA.info迪米特法则 w 迪米特法则分析 不要和“陌生人”说话(Dont talk to strangers.)只与你的直接朋友通信(Talk only to your immediate friends.)(1)当前对象本身(this)(2)以参数形式传入到当前对象方法中的对象(3)当前对象的成员对象(4)如果当前对象的成员对象是一个集合,那么集合中的元素也都是朋友(5)当前对象所创建的对象 任何一个对

27、象,如果满足上面的条件之一,就是当前对象的“朋友”,否则就是“陌生人”在应用迪米特法则时,一个对象只能与直接朋友发生交互,不要和“陌生人”发生直接交互,这样做可以降低系统的耦合度,一个对象的改变不会给太多其他对象带来影响www.ChinaSA.info迪米特法则 w 迪米特法则分析 迪米特法则要求在设计系统时,应该尽量减少对象之间的交互 如果两个对象之间不必彼此直接通信,那么这两个对象就不应该发生任何直接的相互作用 如果其中一个对象需要调用另一个对象的方法,可以通过“第三者”转发这个调用 通过引入一个合理的“第三者”来降低现有对象之间的耦合度www.ChinaSA.info迪米特法则 w 迪米

28、特法则分析 应用迪米特法则注意点:在类的划分上,应当尽量创建松耦合的类,类之间的耦合度越低,越有利于复用,一个处在松耦合中的类一旦被修改,不会对关联的类造成太大影响 在类的结构设计上,每一个类都应当尽量降低其成员变量和成员函数的访问权限 在类的设计上,只要有可能,一个类型应当设计成不变类 在对其他类的引用上,一个对象对其他对象的引用应当降到最低www.ChinaSA.info迪米特法则 w 迪米特法则实例 实例说明某 软 件 公 司 所 开 发CRM 系 统 包 含 很 多 业 务 操 作 窗 口,在 这 些 窗 口 中,某些 界 面 控 件 之 间 存 在 复 杂 的 交 互 关 系,一 个

29、 控 件 事 件 的 触 发 将 导 致 多 个 其 他界 面 控 件 产 生 响 应。例 如,当 一 个 按 钮(Button)被 单 击 时,对 应 的 列 表 框(List)、组 合 框(ComboBox)、文 本 框(TextBox)、文 本 标 签(Label)等 都 将 发 生改 变,在 初 始 设 计 方 案 中,界 面 控 件 之 间 的 交 互 关 系 可 以 简 化 为 如 图2-9 所示的结构。图2-9 初始设计方案结构图在 图2-9 中,由 于 界 面 控 件 之 间 的 交 互 关 系 复 杂,导 致 在 该 窗 口 中 增 加 新的 界 面 控 件 时 需 要 修 改 与 之 交 互 的 其 他 控 件 的 源 代 码,系 统 扩 展 性 较 差,也不便于增加和删除控件。现使用迪米特法则对其进行重构。www.ChinaSA.info迪米特法则 w 迪米特法则实例 实例解析www.ChinaSA.infoEND

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

当前位置:首页 > 应用文书 > 项目管理

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

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com