04设计模式六大原则-公开课件.ppt

  1. 1、本文档共42页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
本章目标 开-闭原则 单一职责原则 接口隔离原则 里氏代换原则 依赖倒转原则 组合优先于继承 面向对象诊所 系统僵化,不可修改或者扩展(修改难或扩展难)。 过分复杂或者重复代码多,往往看代码的时候不知道从哪里看起,也不知道程序会跑到哪里去。 不可复用,公共部分剥离不出来只能到处拷贝。 不够稳定,经常出错-改-出错-改….. 系统运行不可靠,连自己也不敢相信自己的系统 原则的诞生 面向对象:封装、继承、多态三大支柱蕴含了用抽象来封装变化,降低耦合,实现复用的精髓。 封装:隐藏内部实现,保护内部信息 继承:实现复用,归纳共性 多态:改写对象行为,实现更高级别的继承 要实现这些目的,就必须遵守一些原则:封装变化、对接口编程、少继承多聚合…… 实现系统的可扩展、可复用、灵活性好、维护性好 一、开-闭原则(OCP) 核心思想: 对扩展开放:有新的需求或变化时,可以对现有代码进行扩展,以适应新情况。 对修改关闭:类一旦设计完成,就可以独立完成自己的工作,而不要再对类进行任何修改。 实现方式:抽象,多态,继承,接口 实例分析 实例分析 先不论程序的健壮性,如果客户要求增加求余运算,该如何处理? 改进后 开闭原则小结 开闭原则适用于那些需求会经常发生变化的系统,应该努力使大部分模块满足开闭原则。开闭原则是面向对象设计的核心,满足该原则可以达到最大限度的复用和可维护性。 二、单一职责原则(SRP) (1)目的:如果你有多个原因去改变一个类,那么应该把这些引起变化的原因分离开,把这个类分成多个类,每个类只负责处理一种改变。当你做出某种改变时,只需要修改负责处理该改变的类。 (2)单一职责原则 一个类应该只受一种变化的影响。 如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力。这种耦合会导致脆弱的设计,当变化发生时,设计会遭到意想不到的破坏。 单一职责原则(SRP) (3)好处: ① 类的复杂性降低,实现什么职责都有清晰明确的定义。 ② 可读性提高。 ③ 可维护性提高。 ④ 变更引起的风险降低。 实例 单一职责原则小结 优点:消除耦合,减小因需求变化引起代码僵化性臭味 使用SRP注意点: 1、一个合理的类,应该仅有一个引起它变化的原因,即单一职责; 2、在没有变化征兆的情况下应用SRP或其他原则是不明智的; 3、在需求实际发生变化时就应该应用SRP等原则来重构代码; 4、使用测试驱动开发会迫使我们在设计出现臭味之前分离不合理代码; 5、如果测试不能迫使职责分离,僵化性和脆弱性的臭味会变得很强烈,那就应该用Facade或Proxy模式对代码重构; 三、接口隔离原则(ISP) (1)目的:当我们设计应用程序的时候,如果一个模块包含多个子模块,那么我们应该小心对该模块做出抽象。设想该模块由一个类实现,我们可以把系统抽象成一个接口。但是当我们想要添加一个新的模块扩展程序时,如果要添加的模块只包含原系统中的一些子模块,那么就会强迫我们实现接口中的所有方法,并且还要编写一些哑方法。这样的接口被称为胖接口或者叫被污染的接口。 (2)接口隔离原则 接口隔离原则表明客户端不应该被强迫实现一些他们不会使用的接口,应该把胖接口中的方法分组,然后用多个接口代替它,每个接口服务于一个子模块。 实力分析 改进后 接口隔离原则小结 接口的设计应该遵循最小接口原则,不要把用户不使用的方法塞进同一个接口里。 如果一个接口的方法没有被使用到,则说明该接口过胖,应该将其分割成几个功能专一的接口。 过度的使用该原则将会产生大量的包含单一方法的接口,所以需要根据经验并且识别出那些将来需要扩展的代码来使用它。 四、里氏代换原则(LSP) 核心思想: 在一个软件系统中,子类应该可以替换任何基类能够出现的地方,并且经过替换以后,代码还能正常工作。 目的:当我们设计程序模块时,我们会创建一些类层次结构,然后我们通过扩展一些类来创建它们的子类。我们必须确保基类的引用可以被子类替换而不影响模块的功能,否则当我们在已有程序模块中使用它们时将会产生不可预料的结果。 实例 分析 实例分析 父类中不存在MyMethod()方法,导致子类不能替换父类,属于僵化设计,当有新类增加时,必须修改分支判断。 改进 如果Method()被实现为虚方法,并且在子类中可以被重写,则传入DoSomeThing的参数既可以是父类类型也可以是子类类型,子类完全可以代替父类在此调用自己的方法。 小结 Liskov替换原则是关于集成机制的设计原则,违反了Liskov替换原则必然导致违反开闭原则。 Liskov替换原则能够保证系统具有良好的扩展性,同时实现基于多态的抽象机制,能够减少代码冗余,避免运行期间的类型判断。 子类必须满足基类和客户端对其行

您可能关注的文档

文档评论(0)

老刘忙 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档