当前位置: 首页 > news >正文

设计规则之里氏替换原则

tip: 作为程序员一定学习编程之道,一定要对代码的编写有追求,不能实现就完事了。我们应该让自己写的代码更加优雅,即使这会费时费力。

相关规则:

推荐:体系化学习Java(Java面试专题)

1.6大设计规则-迪米特法则
2.6大设计原则-接口隔离原则
3.6大设计规则-开闭原则
4.6大设计规则-单一职责原则
5.6大设计规则-依赖倒置原则

文章目录

  • 里氏替换原则

里氏替换原则

里氏替换原则 Liskov Substiution Principle ,简称 LSP。怎么理解这个原则呢,《设计模式之禅》第二章介绍它有两种定义:

1、If for each object ol of type S there is an object o2 oftype T such that for all programs P defined in terms of T, the behavior of P is unchangedwhen o1 is substituted for o2 then S is a subtype of T.
如果对每一个类型为S的对象ol,都有类型为T的对象o2,使得以T定义的所有程序P在所有的对象o1都代换成o2时,程序P的行为没有发生变化,那么类型S是类型T的子类型。

这句话有点晦涩,简单来说就是 T 是父类,S 是子类,在一段代码中,将 T 替换成 S ,代码的逻辑并没发生任何变化。

2、Functions that use pointers or references to base classes must be able to useobjects of derived classes without knowing it. 所有引用基类的地方必须透明的使用其子类的对象。
这句话的意思呢,跟上面的差不多,就父类出现的地方,换成子类,代码不会异常,但是如果反过来,子类出现的地方,要是换成父类,那么就有可能出错了。

参考下面的例子:
我们可以将保时捷换成法拉利,并没有改变 User 类的代码逻辑,依然是先 先点火,在驾驶,这就是里氏替换原则的第一个定义。

package com.pany.camp.design.principle.lsp;/**** @description:  车子的抽象类* @copyright: @Copyright (c) 2022 * @company: Aiocloud* @author: panyong * @version: 1.0.0 * @createTime: 2023-05-31 13:26*/
public abstract class Car {/*** 启动** @since 1.0.0* @param* @return: void* @author: panyong* @version: 1.0.0* @createTime: 2023-05-31 13:28*/abstract void firing();/*** 车子的牌子** @since 1.0.0* @param* @return: String* @author: pany* @version: 1.0.0* @createTime: 2023-05-31 13:36*/abstract String getName();
}
package com.pany.camp.design.principle.lsp;
/**** @description:  保时捷* @copyright: @Copyright (c) 2022* @company: Aiocloud* @author: pany* @version: 1.0.0* @createTime: 2023-05-31 13:30*/
public class Porsche extends Car {@Overridevoid firing() {System.out.println("drive porsche");}@OverrideString getName() {return "porsche";}
}
package com.pany.camp.design.principle.lsp;/**** @description: 法拉利* @copyright: @Copyright (c) 2022* @company: Aiocloud* @author: pany* @version: 1.0.0* @createTime: 2023-05-31 13:40*/
public class Ferrari extends Car {@Overridevoid firing() {System.out.println("drive ferrari");}@OverrideString getName() {return "ferrari";}
}
package com.pany.camp.design.principle.lsp;public class User {public void drive(Car car) {car.firing();System.out.println("drive " + car.getName());}public static void main(String[] args) {User user = new User();// 我可以换成其他的方式,并没有改变代码的逻辑user.drive(new Porsche());user.drive(new Ferrari());}
}
http://www.lryc.cn/news/91803.html

相关文章:

  • 【叠高高】叠蛋糕游戏的微信小程序开发流程详解
  • 收集关键词的方法有哪些?(如何查找精准的行业流量关键词)
  • 【GreenDao】RxQuery查询并修改GreenDao数据库,完成后更新UI
  • Modifier ‘public‘ is redundant for interface methods错误
  • Redis缓存击穿及解决问题
  • 环境感知算法——2.CenterNet基于KITTI数据集训练
  • JUC 高并发编程基础篇
  • 【十二】设计模式~~~行为型模式~~~命令模式(Java)
  • 可再生能源的不确定性和储能系统的时间耦合的鲁棒性和非预期性区域微电网的运行可行性研究(Matlab代码实现)
  • Revit中如何使创建的族文件内存变小
  • ClassLoader源码
  • Kafka分区消息积压排查指南
  • 数据库 期末复习(4) 概念数据库的设计
  • WuThreat身份安全云-TVD每日漏洞情报-2023-05-26
  • 关于Idea的一些常用设置项
  • Python使用WMI模块获取Windows系统的硬件信息,并使用pyinstaller库编译打包成exe的可执行文件
  • JavaScript语句(七)
  • 孪生诱捕网络在欺骗防御领域的应用
  • 【性能测试】Jenkins+Ant+Jmeter自动化框架的搭建思路
  • ARM体系结构与异常处理
  • 招聘网站—Hive数据分析
  • 双指针滑动窗口整理1——长度最小的子数组、水果成篮
  • textarea之换行、replace、\n、br、innerHTML
  • SKD240
  • 大数据采集怎么做呢?
  • 【学习日记】操作系统-入门知识-个人学习记录
  • ChatGPT自动生成思维导图
  • count(0)、count(1)和count(*)、count(列名) 的区别
  • python爬虫入门,10分钟就够了,这可能是我见过最简单的基础教学
  • 华为OD机试真题 Java 实现【记票统计】【牛客练习题】