zoukankan      html  css  js  c++  java
  • 设计模式简记-设计原则之里氏替换原则

    3.3 里氏替换原则

    3.3.1 如何理解“里式替换原则”?

    • 英文翻译:Liskov Substitution Principle,简写为LSP

    • 子类对象(object of subtype/derived class)能够替换程序(program)中父类对象(object of base/parent class)出现的任何地方,并且保证原来程序的逻辑行为(behavior)不变及正确性不被破坏。

    • 与多态的区别

      虽然从定义描述和代码实现上来看,多态和里式替换有点类似,但它们关注的角度是不一样的。多态是面向对象编程的一大特性,也是面向对象编程语言的一种语法。它是一种代码实现的思路。而里式替换是一种设计原则,是用来指导继承关系中子类该如何设计的,子类的设计要保证在替换父类的时候,不改变原有程序的逻辑以及不破坏原有程序的正确性。

    3.3.2 违反里式替换原则的例子

    • 子类违背父类声明要实现的功能:

      父类中提供的 sortOrdersByAmount() 订单排序函数,是按照金额从小到大来给订单排序的,而子类重写这个 sortOrdersByAmount() 订单排序函数之后,是按照创建日期来给订单排序的。那子类的设计就违背里式替换原则。

    • 子类违背父类对输入、输出、异常的约定

    • 子类违背父类注释中所罗列的任何特殊说明

    3.3.3 总结

    里式替换原则是用来指导,继承关系中子类该如何设计的一个原则。理解里式替换原则,最核心的就是理解“design by contract,按照协议来设计”这几个字。父类定义了函数的“约定”(或者叫协议),那子类可以改变函数的内部实现逻辑,但不能改变函数原有的“约定”。这里的约定包括:函数声明要实现的功能;对输入、输出、异常的约定;甚至包括注释中所罗列的任何特殊说明。

    理解这个原则,我们还要弄明白里式替换原则跟多态的区别。虽然从定义描述和代码实现上来看,多态和里式替换有点类似,但它们关注的角度是不一样的。多态是面向对象编程的一大特性,也是面向对象编程语言的一种语法。它是一种代码实现的思路。而里式替换是一种设计原则,用来指导继承关系中子类该如何设计,子类的设计要保证在替换父类的时候,不改变原有程序的逻辑及不破坏原有程序的正确性。

  • 相关阅读:
    spring boot 数据源配置YAML格式
    IDEA 一次启动多个微服务模块项目
    Hibernate错误:Could not bind factory to JNDI
    Excel文本型数据转为数值型的方法
    创建Java不可变型的枚举类型Gender
    创建正真的Java不可变类
    创建Java不可变类
    重新编写equals()方法,hashCode()方法,以及toString(),提供自定义的相等标准,以及自描述方法
    Java 7 新增功能
    Java应用程序中System.out.println输出中文乱码
  • 原文地址:https://www.cnblogs.com/wod-Y/p/12655765.html
Copyright © 2011-2022 走看看