设计原则(四):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 可以且应该被应用于软件架构层面,因为一旦违背了可替换性,该系统架构就不得不为此增添大量复杂的应对机制。


最后


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

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

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

相关文章
|
JavaScript 前端开发 安全
15个最佳的代码评审(Code Review)工具
  代码评审可以被看作是计算机源代码的测试,它的目的是查找和修复引入到开发阶段的应用程序的错误,提高软件的整体素质和开发者的技能。代码审查程序以各种形式,如结对编程,代码抽查等。在这个列表中,我们编制了15个最好的代码审查工具,这将有助于开发者节省代码审查时间。
5717 0
|
3月前
|
人工智能 前端开发 小程序
AI 编程工具排名 2026:7 款主流横评(国产 + 海外实测)
AI 编程工具有哪些?哪个 AI 写代码最强?2026 年 AI 编程工具排名横评:Cursor、Bolt.new、Lovable、v0、秒悟 Meoo、通义灵码。从场景适配度、价格、商用合规、中文支持 6 个维度实测。
10870 0
|
Java API 网络架构
基于 Spring Boot 框架开发 REST API 接口实践指南
本文详解基于Spring Boot 3.x构建REST API的完整开发流程,涵盖环境搭建、领域建模、响应式编程、安全控制、容器化部署及性能优化等关键环节,助力开发者打造高效稳定的后端服务。
1625 1
|
安全
基于Reactor模式的高性能服务器之Acceptor组件(处理连接)
本节介绍了对底层 Socket 进行封装的设计与实现,通过 `Socket` 类隐藏系统调用细节,提供简洁、安全、可读性强的接口。重点包括 `Socket` 类的核心作用(管理 `sockfd_`)、成员函数的功能(如绑定地址、监听、接受连接等),以及 `Acceptor` 组件的职责:监听连接、接收新客户端连接并分发给上层处理。同时说明了 `Acceptor` 与 `EventLoop` 和 `TcpServer` 的协作关系,并展示了其成员变量和关键函数的工作机制。
318 2
|
存储 算法 Linux
CTF—GIF文件格式、隐写方法及案例
CTF—GIF文件格式、隐写方法及案例
1781 0
|
XML Java 网络架构
使用 Spring Boot 公开 SOAP Web 服务端点:详细指南
使用 Spring Boot 公开 SOAP Web 服务端点:详细指南
2069 0
|
存储 自动驾驶 关系型数据库
无人驾驶背后的技术 - PostGIS点云(pointcloud)应用
标签 PostgreSQL , PostGIS , box , grid , pointcloud , pgpointcloud , point聚合 , KNN , 自动驾驶 , 自动配送 , 无人驾驶 背景 科幻电影的场景随着技术的发展,正在一步步的从荧幕变成现实。
11292 1
|
SQL 关系型数据库 定位技术
|
15天前
|
人工智能 JSON API
全网刷屏的 Jev 模型正式开放!一手实战测评 + 保姆级教程
全网爆火的 Jev 模型是什么?有什么用?怎么使用?怎么接入 AI 编程工具?效果真的好么?傻子可懂的 Jev 保姆级实战教程 + 项目实战测评来啦
8163 15
|
14天前
|
人工智能 并行计算 PyTorch
秋叶 ComfyUI 2026 整合包 v3.2 完整部署教程:Python 3.13 + Torch 2.13 全栈升级
秋叶aaaki ComfyUI 2026年8月整合包v3.2正式发布!全面升级Python 3.13.11、PyTorch 2.13.0+cu130及ComfyUI v0.30.2,原生支持MiniMax H3、Wan 2.2、Qwen-Image-2.1等2026主流音视频/图像模型,解压即用,无需环境配置。
2351 13

热门文章

最新文章