设计模式原则之里氏替换原则
转载自:https://mp.weixin.qq.com/s/Uq4g53cQ7YKAXP8TuRV2Gw
定义:
1:如果对每一个类型为 T1的对象 o1,都有类型为 T2 的对象o2,使得以 T1定义的所有程序 P 在所有的对象 o1 都代换成 o2 时,程序 P 的行为没有发生变化,那么类型 T2 是类型 T1 的子类型。
2:所有引用基类的地方必须能透明地使用其子类的对象
通俗来讲:父类必须能够使用子类替换
里氏替换原则能带来哪些好处?
里氏替换原则能够将对于基类中定义的所有子程序,用在它的任何一个派生类中时的含义都应该是相同的。这样继承才不会增加复杂度,基类才能真正被复用,而派生类也能够在基类的基础上增加新的行为。继承带来的复杂度就降低了。
针对基类编程可以提高代码的复用性
如何保证遵循里氏替换原则
继承是保证里氏替换原则的前提,但是继承也有不能满足里氏替换原则的时候。此时我们可以采用如下两种方法进行设计:
1、重新提取公共部分的方法
把冲突的派生类与基类的共部分提取出来作为一个抽象基类,然后分别继承这个类。
2、改变继承关系
即:从父子关系变为委派关系或兄弟关系。
可以把它们的一些公有特性提取到一个抽象接口,再分别实现。
例如:
最初发送邮件的设计如下:
考虑到给普通人发送邮件和给VIP用户发送邮件中的send方法中的代码有重复,遵从里氏替换原则,我们将共有部分的代码提取出来,并改变CommonCustomer和VIPCustomer的继承关系。修改之后如下:
总结:
里氏替换原则通俗的来讲就是:子类可以扩展父类的功能,但不能改变父类原有的功能。
子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法。
子类中可以增加自己特有的方法。
当子类的方法重载父类的方法时,方法的前置条件(即方法的形参)要比父类方法的输入参数更宽松。
当子类的方法实现父类的抽象方法时,方法的后置条件(即方法的返回值)要比父类更严格。
转载于:https://www.cnblogs.com/xingzc/p/9066867.html
设计模式原则之里氏替换原则相关推荐
- 里氏替换原则——举例说明Java设计模式中的里氏替换原则
里氏替换原则--举例说明Java设计模式中的里氏替换原则 1. 前言 官方定义: 2. 举例说明 2.1 例子介绍 2.2 反例 2.2.1 类图说明 2.2.2 代码说明 2.2.3 测试 2.2. ...
- python里氏替换原则_设计模式六大原则之里氏替换原则
这是设计模式6 大原则系列的第二篇文章,附上前一篇文章地址:设计模式六大原则之单一职责原则.本文主要讲解设计模式的里氏替换原则. 肯定有不少人跟我刚看到这项原则的时候一样,对这个原则的名字充满疑惑.其 ...
- 软件设计原则之里氏替换原则、依赖倒置原则
系列文章目录 软件设计原则之单一职责原则.开闭原则 软件设计原则之里氏替换原则.依赖倒置原则 软件设计原则之接口隔离原则.合成复用原则.迪米特原则 文章目录 系列文章目录 一.里氏替换原则 什么是里氏 ...
- 七大设计原则之里氏替换原则应用
目录 1 里氏替换原则 2 里氏替换原则应用 1 里氏替换原则 里氏替换原则(Liskov Substitution Principle,LSP)是指如果对每一个类型为 T1 的对象 o1,都有类型为 ...
- 6大设计原则之里氏替换原则
面对对象中的继承 优点如下: 代码共享,减少创建类的工作量,每个子类都拥有父类的方法和属性 提高代码的重用性 子类可以形如父类,但又异于父类 提高代码的可扩展性,很多开源框架的扩展接口都是通过继承父类 ...
- 开闭原则与里氏替换原则
1.开闭原则 是面向对象设计的基本原则之一,是"可复用设计"的基础,它的主要原则是:对扩展开放,对修改关闭:意思就是我们改变一个软件时.应该通过扩展方式来改变软件,而不是修改原有的 ...
- 深入理解开闭原则、里氏替换原则
开闭原则(Open-Closed Principle)里氏替换原则 开闭原则(Open-Closed Principle) What 什么是开闭原则? Why 为什么要使用开闭原则和When 什么时候 ...
- 设计模式六大原则之里氏替换原则、依赖倒置原则详解
设计模式六大原则--里氏替换原则.依赖倒置原则详解 1.里氏代换原则(Liskov Substitution Principle) 概念 顾名思义,该原则用于经常发生替换的地方,在Java中指的是实现 ...
- java设计模式3,里氏替换原则
目录 一.里氏替换原则定义 二.里氏替换原则的作用 三.违背原则场景 四.里氏替换原则改变代码 1.抽象人物类 2.哪吒子类 3.敖丙子类 五.关注公众号哪吒编程,回复1024,获取Java学习资料, ...
最新文章
- redis消息队列写入mysql_redis怎么实现将消息队列持久化到数据库中?
- mysql所有班级名称和人数_mysql数据库优化课程---12、mysql嵌套和链接查询(查询user表中存在的所有班级的信息?)...
- 微信小程序发送模板消息,php发送模板消息
- 我的青春谁做主的经典语录
- [转]带花树,Edmonds's matching algorithm,一般图最大匹配
- python-list列表排序问题 sort 与 sorted
- NPER用计算机怎么算,计算机财务管理第三章详解.doc
- python 函数特殊属性
- Struts2→MCV、环境搭建第一个样例、工作原理、核心文件、XML中常用元素、通配符、action后缀、action接收参数、result、标签
- Python-Matplotlib可视化(番外篇)——Matplotlib中的事件处理详解与实战
- HDU 2639 Bone Collector II (dp)
- “公益AI之星”挑战赛-新冠疫情相似句对判定大赛
- 关于信息熵的简单理解
- 【VRP】基于matlab模拟退火算法求解单中心的车辆路径规划问题【含Matlab源码 1340期】
- 【图像隐写】基于matlab LDPC编码译码改进DCT水印嵌入提取【含Matlab源码 832期】
- 【设计过程】.NET ORM FreeSql WhereDynamicFilter 动态表格查询功能
- 在eclipse上安装lomboz插件
- 【FPGA】精品FPGA书籍推荐
- VirtualBox Linux网络配置
- 分数加减法(C语言)
热门文章
- java 多态实现的jvm调用过程_多态:JVM是如何进行方法调用的
- java参数传入泛型类型_Java泛型参数界定到任何一个类型的范围
- 方正高影仪安装方法_铝合金门窗是怎么安装的?
- php asserttrue,PHP8.0的新特性:错误处理方面已经改进
- python列表常用の操作
- c++ 不能分配给为0的数组_【嵌入式C】你有想过quot;数组下标quot;为何从0开始吗?...
- java对象怎么创建_java对象是怎么创建出来的
- 重建索引一般需要多久_游泳小白学游泳,一般需要多久才能学会?猜猜看
- 计算机主机的主要包括,微型计算机的主机主要包括
- c语言中case1 case3 n =1,(n 1)-Step Derivations on n-Groupoids: The Case n = 3