设计原则(四):LSP 里氏替换原则

简介: 设计原则(四):LSP 里氏替换原则

背景介绍


这是我的《架构整洁之道》系列的第八篇,这一篇我们将一起学习 LSP 里氏替换原则~

《架构整洁之道》系列:



LSP 里氏替换原则


1988 年,Barbara Liskov 在描述如何定义子类型时写下了这样一段话 :


这里需要的是一种可替换性:如果对于每个类型是 S 的对象 o1 都存在一个类型为 T 的对象 o2,能使操作 T 类型的程序 P 在用 o2 替换 o1 时行为保持不变,我们就可以将 S 称为 T 的子类型。


为了理解上面这句话,我举几个例子:


  • 案例一


网络异常,图片无法展示
|


假设我们有一个 License 类,该类中有一个名为 calcFee() 的方法,该方法将由 Billing 应用程序来调用。而 License 类有两 个“子类型”: PersonalL工cense 与 BusinessLicense,这两个类会用不同的算法来计算授权费用。

上述设计是符合 LSP 原则的,因为 Billing 应用程序的行为并不依赖于其使用的任何一个衍生类。也就是说,这两个衍生类的对象都是可以用来替换 License 类对象的。


  • 案例二


网络异常,图片无法展示
|


正方形/长方形问题是一个著名的违反 LSP 的设计案例。在这个案例中,Square 类并不 Rectangle 类的子类型,因为 Rectangle 类的高和宽可以分别修改,而 Square类的高和宽则必须一同修改。由于 User类始终认为自己在操作 Rectangle 类,因此会带来一些泪淆。


如果想要防范这种违反 LSP 的行为,唯一的办法就是在 User 类中增加用于区分 Rectangle 和 Square 的检测逻辑。但这样一来,User 类的行为又将依赖于它所使用的类,这两个类就不能互相替换了。


结束语


网络异常,图片无法展示
|


在面向对象这场编程革命兴起的早期,我们的普遍认知正如上文所说,认为 LSP 只不过是指导如何使用继承关系的一种方法,然而随着时间的推移,LSP 逐渐演变成了一种更广泛的、指导接口与其实现方式的设计原则。LSP 可以且应该被应用于软件架构层面,因为一旦违背了可替换性,该系统架构就不得不为此增添大量复杂的应对机制。


最后


✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨

少年向来不识天高地厚
放眼处皆自负才高八斗
虽是自命风流
倒也坦诚无忧
我爱这样的少年
谦和而狂妄
骄傲又坦然☀️

✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨

相关文章
|
SQL 数据采集 分布式计算
DataWorks 基本操作演示|学习笔记
快速学习 DataWorks 基本操作演示
5725 0
DataWorks 基本操作演示|学习笔记
|
6月前
|
Java API 网络架构
基于 Spring Boot 框架开发 REST API 接口实践指南
本文详解基于Spring Boot 3.x构建REST API的完整开发流程,涵盖环境搭建、领域建模、响应式编程、安全控制、容器化部署及性能优化等关键环节,助力开发者打造高效稳定的后端服务。
931 1
|
9月前
|
人工智能 API 语音技术
WhisperChain:开源 AI 实时语音转文字工具!自动消噪优化文本,效率翻倍
WhisperChain 是一款基于 Whisper.cpp 和 LangChain 的开源语音识别工具,能够实时将语音转换为文本,并自动清理和优化文本内容,适用于会议记录、写作辅助等多种场景。
2621 2
WhisperChain:开源 AI 实时语音转文字工具!自动消噪优化文本,效率翻倍
|
机器学习/深度学习 算法 PyTorch
YOLO如何入门?
YOLO如何入门?
|
存储 算法 Linux
CTF—GIF文件格式、隐写方法及案例
CTF—GIF文件格式、隐写方法及案例
896 0
|
XML Java 网络架构
使用 Spring Boot 公开 SOAP Web 服务端点:详细指南
使用 Spring Boot 公开 SOAP Web 服务端点:详细指南
1430 0
|
Linux 数据安全/隐私保护 Windows
解决Windows密码丢失问题:详细指南
最近因为某些工作缘故,接触到windows比较频繁,特此记录一下 当下,计算机安全是每个人都不能忽视的重要问题。然而,有时可能因为忘记密码而无法访问自己的Windows系统,这会导致数据和信息的临时不可用。 本文将详细介绍两种场景下的密码恢复方法:一种是针对虚拟机,另一种适用于物理机。通过这些方法,可以快速恢复对系统的访问,确保业务的连续性。
解决Windows密码丢失问题:详细指南
|
机器学习/深度学习 人工智能 算法
技术开源|FunASR升级第三代热词方案
技术开源|FunASR升级第三代热词方案
3599 62
|
JavaScript 前端开发 中间件
Redux从入门到进阶,看这一篇就够了!
该文章全面介绍了Redux的基本概念与使用方法,从Redux的安装配置到结合React应用的状态管理,再到中间件如Redux-thunk的使用,帮助读者从零开始掌握Redux在复杂应用中的实践应用。
|
Python
多标签多分类Muticlass Mutioutput的Mutilogloss(mlogloss)实现
文章介绍了logloss和mlogloss的计算方法,包括它们的Python实现代码。logloss用于评估二分类模型的性能,而mlogloss适用于多分类问题。
172 3