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方法,最终在调用的时候产生了错误的答案

Java设计模式七大原则之里氏替换原则详解

方案二

定义基础类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);
   }
}

测试结果: 可以看到测试结果正确

Java设计模式七大原则之里氏替换原则详解

对比分析

方案一,直接继承计算器类,并重写了父类的非抽象方法add,导致在调用的时候产生了错误的结果 方案二,继承基础base类,并注入计算器类Calculator类作为依赖,遵守里氏替换原则,得出正确的结果

来源:https://juejin.cn/post/7059273679682666510

标签:Java,设计模式,里氏替换原则
0
投稿

猜你喜欢

  • 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
  • SpringBoot2之PUT请求接收不了参数的解决方案

    2023-08-23 01:32:07
  • 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
  • Java读取TXT文件内容的方法

    2023-11-23 22:33:41
  • 基于C语言实现静态通讯录的示例代码

    2023-07-02 22:07:38
  • Spring Boot缓存实战之Redis 设置有效时间和自动刷新缓存功能(时间支持在配置文件中配置)

    2023-11-11 01:57:18
  • Java热门笔试试题整理

    2023-11-25 08:56:33
  • 有关Java中的BeanInfo介绍

    2023-08-05 00:13:42
  • 基于JavaMail的Java邮件发送

    2022-10-30 18:56:56
  • Java中ShardingSphere分库分表实战

    2023-11-24 09:20:37
  • MyBatis-Plus联表查询(Mybatis-Plus-Join)的功能实现

    2023-11-25 03:24:33
  • Java Arrays.asList使用方法解析

    2023-11-26 06:27:09
  • 学习SpringBoot容器功能及注解原理

    2023-11-24 22:06:17
  • slf4j jcl jul log4j1 log4j2 logback各组件系统日志切换

    2023-08-08 13:00:41
  • C#实现XML文件操作详解

    2023-07-16 12:36:52
  • java获取注册ip实例

    2023-11-03 23:01:12
  • asp之家 软件编程 m.aspxhome.com