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


最后


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

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

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

相关文章
六大设计原则-接口隔离原则【Interface Segregation Principle】
六大设计原则-接口隔离原则【Interface Segregation Principle】
48 0
|
设计模式 关系型数据库
软件架构设计原则之里氏替换原则
里氏替换原则(Liskov Substitution Principle,LSP)是指如果对每一个类型为T1的对象o1,都有类型为T2的对象O2,使得以T1定义的所有程序P在所有的对象O1都替换成O2时,程序P的行为没有发生变化,那么类型T2是类型T1的子类型。
79 0
|
设计模式 安全 Java
设计原则之接口隔离原则
设计原则之接口隔离原则
74 0
设计原则之接口隔离原则
|
Java
深入理解开闭原则、里氏替换原则
深入理解开闭原则、里氏替换原则
208 0
|
Oracle NoSQL 关系型数据库
面向对象程序设计原则——依赖倒置原则(DIP)
面向对象程序设计原则——依赖倒置原则(DIP)
132 0
|
设计模式 测试技术
设计模式 - 六大设计原则之LSP(里氏替换)
里氏替换原则(Liskov Substitution Principle , LSP) 由麻省理工学院计算机科学西教授 Barbara Liskov 于1987年提出, 她提出: **继承必须确保超类所拥有的性质在子类中仍然成立。**
186 0
设计模式 - 六大设计原则之LSP(里氏替换)
软件架构设计原则--里氏替换原则
本专栏内容参考自:咕泡学院Tom老师的《Spring5核心原理与30个类手写实战》,仅作个人学习记录使用,如有侵权,联系速删
软件架构设计原则--里氏替换原则
|
设计模式
里氏替换原则|设计原则
里氏替换原则的内容可以描述为: “派生类(子类)对象可以在程序中代替其基类(超类)对象。”
|
Java API 开发工具
接口隔离原则|设计原则
今天为大家带来的依旧是 设计原则 的知识: 接口隔离原则