Java设计模式七大原则之里氏替换原则详解
作者:温故知新之java 时间:2022-05-22 13:41:10
定义
里氏替换原则(Liskov Substitution Principle,LSP),官方定义如下: 如果对每一个类型为S的对象o1,都有类型为T的对象o2,使得以T定义的所有程序P在所有的对象 o1都代换成o2时,程序P的行为没有发生变化,那么类型S是类型T的子类型,所有引用基类的地方必须能透明地使用其子类的对象。则通俗的来讲:子类可以扩展父类的功能,但是子类不能修改父类原有的功能 里氏替换原则就是给继承性的使用制定了规范
案例
需求
现在有一个计算器(父类)可以完成加减乘除,定义其子类,来演示继承可能出现的问题
方案一
定义计算器类Calculator.java
/**
* 计算器类
* @author:liyajie
* @createTime:2022/1/31 15:25
* @version:1.0
*/
public class Calculator {
//定义加 * 能
public int add(int a,int b){
return a + b;
}
//定义减 * 能
public int sub(int a,int b){
return a - b;
}
}
定义超级计算器类SuperCalculator.java
/**
* 超级计算器类
* @author:liyajie
* @createTime:2022/1/31 15:25
* @version:1.0
*/
public class SuperCalculator extends Calculator{
//增补需求,两数相加再加5
@Override
public int add(int a,int b){
return a + b + 5;
}
//希望两数相加之和与100求差
public int mul(int a,int b){
int count = add(a, b);
return 100 - count;
}
}
定义测试类Test1.java
/**
* 测试类1
* @author:liyajie
* @createTime:2022/1/31 15:25
* @version:1.0
*/
public class Test1 {
public static void main(String[] args) {
int result = new Calculator().add(4,6);
System.out.println("4和6之和为:" + result);
int mul = new SuperCalculator().mul(4,6);
System.out.println("4和6之和与100相差:" + mul);
}
}
测试结果: 可以看到4和6之后与100相差的结果为85,明显是错误的答案。错误的原因就是SuperCalculator类继承Calculator类之后,重写了add方法,最终在调用的时候产生了错误的答案
方案二
定义基础类Base.java
/**
* 基础类
* @author:liyajie
* @createTime:2022/1/31 15:36
* @version:1.0
*/
public class Base {
}
改造后的超级计算器类SuperCalculatorNew.java
/**
* 超级计算器类
* @author:liyajie
* @createTime:2022/1/31 15:25
* @version:1.0
*/
public class SuperCalculatorNew extends Base{
private Calculator calculator = new Calculator();
//增补需求,两数相加再加5
public int add(int a,int b){
return a + b + 5;
}
//希望两数相加之和与100求差
public int mul(int a,int b){
int count = calculator.add(a, b);
return (100 - count);
}
}
测试类Test2.java
/**
* 测试类2
* @author:liyajie
* @createTime:2022/1/31 15:25
* @version:1.0
*/
public class Test2 {
public static void main(String[] args) {
int result = new Calculator().add(4,6);
System.out.println("4和6之和为:" + result);
int mul = new SuperCalculatorNew().mul(4,6);
System.out.println("4和6之和与100相差:" + mul);
}
}
测试结果: 可以看到测试结果正确
对比分析
方案一,直接继承计算器类,并重写了父类的非抽象方法add,导致在调用的时候产生了错误的结果 方案二,继承基础base类,并注入计算器类Calculator类作为依赖,遵守里氏替换原则,得出正确的结果
来源:https://juejin.cn/post/7059273679682666510
标签:Java,设计模式,里氏替换原则
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
java 动态增加定时任务示例
2023-07-29 06:56:00
Spring如何利用@Value注解读取yml中的map配置
2023-07-24 21:18:00
Redis6搭建集群并在SpringBoot中使用RedisTemplate的实现
2023-10-31 14:48:05
![](https://img.aspxhome.com/file/2023/2/58622_0s.png)
SpringBoot2之PUT请求接收不了参数的解决方案
2023-08-23 01:32:07
![](https://img.aspxhome.com/file/2023/2/58202_0s.png)
Android 判断某个Activity 是否在前台运行的实例
2023-07-24 19:29:21
Java try-with-resource语法使用解析
2021-10-09 02:28:37
Java Set集合及其子类HashSet与LinkedHashSet详解
2023-11-26 11:39:35
![](https://img.aspxhome.com/file/2023/0/59510_0s.png)
Java读取TXT文件内容的方法
2023-11-23 22:33:41
基于C语言实现静态通讯录的示例代码
2023-07-02 22:07:38
![](https://img.aspxhome.com/file/2023/2/103102_0s.gif)
Spring Boot缓存实战之Redis 设置有效时间和自动刷新缓存功能(时间支持在配置文件中配置)
2023-11-11 01:57:18
![](https://img.aspxhome.com/file/2023/3/59053_0s.png)
Java热门笔试试题整理
2023-11-25 08:56:33
有关Java中的BeanInfo介绍
2023-08-05 00:13:42
![](https://img.aspxhome.com/file/2023/5/57955_0s.jpg)
基于JavaMail的Java邮件发送
2022-10-30 18:56:56
![](https://img.aspxhome.com/file/2023/1/60931_0s.jpg)
Java中ShardingSphere分库分表实战
2023-11-24 09:20:37
![](https://img.aspxhome.com/file/2023/7/59767_0s.jpg)
MyBatis-Plus联表查询(Mybatis-Plus-Join)的功能实现
2023-11-25 03:24:33
![](https://img.aspxhome.com/file/2023/3/60023_0s.png)
Java Arrays.asList使用方法解析
2023-11-26 06:27:09
学习SpringBoot容器功能及注解原理
2023-11-24 22:06:17
![](https://img.aspxhome.com/file/2023/4/59044_0s.png)
slf4j jcl jul log4j1 log4j2 logback各组件系统日志切换
2023-08-08 13:00:41
![](https://img.aspxhome.com/file/2023/8/57928_0s.png)
C#实现XML文件操作详解
2023-07-16 12:36:52
![](https://img.aspxhome.com/file/2023/0/67050_0s.png)
java获取注册ip实例
2023-11-03 23:01:12