设计模式七大设计原则

文章目录

  • 设计模式
    • 七大设计原则
      • 开闭原则
      • 里氏替换原则
      • 依赖倒置原则
      • 接口隔离原则
      • 迪米特法则-最少知道原则
      • 单一职责原则
      • 合成复用原则

设计模式

面向对象的三个基本特征:

  1. 继承
  2. 封装
  3. 多态

设计模式体现了代码的耦合性、内聚性、可维护性、可扩展性、重用性、灵活性。

  1. 代码重用性:相同功能代码不用多次编写
  2. 可读性
  3. 可扩展性:添加新功能非常方便,可维护
  4. 可靠性:当我们添加新功能不影响原有的功能
  5. 使程序呈现高内聚、低耦合的特性

七大设计原则

开闭原则

原则:一个软件实体如类、模块、函数应该对拓展开发、对修改关闭

在程序需要拓展的时候,不能去修改原有代码,为了易于维护我们应该更多的学会使用接口和抽象类,在设计的时候尽量适应变化,提高系统的稳定性、灵活性。

场景:书店销售书籍

假如我们想在双十一对书籍进行打折。

实现方案:

  1. 修改接口:在Book类中新增一个打折接口;但是这样做其他所有实现类都需要改动。

  2. 修改实现类方法:NovelBook类修改原有的getPrice()方法,实现打折逻辑,但是这样做的话违背了开闭原则,如果双十一过去了是不是还有再把代码回退

  3. 实现类新增方法:NovelBook类新增getDiscountPrice()方法,这个看起来不错,但是一个类中提供两个获取价格的接口对调用者不是很友好,而且随着业务需求越来越多这个类不断添加新的方法,本来我们设计这个类的目的只是想获取书籍的基本信息,但是现在又混合了很多业务逻辑,那么这个类就违背了单一职责原则。

  4. 派生出一个打折类:该类继承NovelBook基类,用来专门处理打折逻辑,这样不用修改原有实现类不会对上层调用者产生影响,利用拓展实现功能,其实这种对基类已实现的方法进行覆盖违背了里氏替换原则,如果想不违背里氏替换原则只能在派生类中添加新的方法,并且在基类的方法中添加final保证不会被重写,这里我们只是讲解开闭原则,就不考虑那么多。

    引用:https://www.jianshu.com/p/d36da4f136c4

里氏替换原则

原则:所有基类在的地方,都可以换成子类,程序还可以正常运行。这个原则与继承特性密切相关。

相信我们经常用到继承,那你知道继承有哪些优点/p>

  1. 子类拥有父类的所有方法和属性,从而减少创建类的工作量。
  2. 提高了代码的重用性。
  3. 提高了代码的拓展性,子类不但拥有父类的所有功能,还可以添加自己的功能。

缺点:

  1. 继承是有侵入性的,只要继承,就必须拥有父类的所有属性和方法。
  2. 降低了代码的灵活性。因为继承时,父类对子类有一种约束。
  3. 增强了耦合性,当需要对父类的代码进行修改时,必须考虑到对子类产生的影响。

里氏替换原则对继承进行了规则上的约束

  1. 子类必须实现父类的抽象方法,但不得重写(覆盖)父类的已实现的方法。
  2. 子类可以增加自己特有的方法。
  3. 当子类重载父类的方法时,方法的形参要比父类的输入参数更宽松。(只能重载不能重写)
  4. 当子类的方法实现父类的抽象方法时,方法的返回值要比父类更严格。

约束详细解释:

  1. 子类必须实现父类的抽象方法,但不得重写(覆盖)父类的已实现的方法。

    首先子类必须实现父类的抽象方法,不然编译无法通过;

    如果重写父类的方法,当用子类替代父类后会出现意想不到的错误,如果想避免这种问题我们可以将父类不得重写的方法添加final关键字,这样在语法层面就可以避免违反里氏替换原则;

  2. 子类可以增加自己特有的方法

    子类可以对父类功能进行拓展。

  3. 当子类重载父类的方法时,方法的形参要比父类的输入参数更宽松

    定义一个父类利用子类重载run方法如果此时作为参数传入

    结果会发现用同一个参数子类和父类调用结果却不同,会出现程序调用混乱,由于子类形参为HashMap导致父类方法没有被重写的情况下调用了子类。

    如果我们把子类的形参范围设置的比父类更大就不会出现上述问题。

    来源:成长的小牛233

    声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2021年3月7日
下一篇 2021年3月7日

相关推荐