深入理解设计原则之里氏替换原则(LSP)【软件架构设计】

这篇具有很好参考价值的文章主要介绍了深入理解设计原则之里氏替换原则(LSP)【软件架构设计】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

系列文章目录

C++高性能优化编程系列
深入理解软件架构设计系列
深入理解设计模式系列
高级C++并发线程编程

1、里氏替换原则的定义和解读

里氏替换原则(Liskov Substitution Principle, LSP)于1986年有Barbara Liskov提出,他当时是这样描述这条原则的:如果S是T的子类型,那么T的对象可以被S的对象所替换,并不影响代码的运行。1996年,Robert Martin在他的SOLID原则中重新描述了里氏替换原则:使用父类对象的函数可以在不了解子类的情况下替换为使用子类对象
结合上面的描述,我们将里氏替换原则描述为:子类对象能够替换到程序中的父类对象出现的任何地方,并且保证程序原有的逻辑行为不变和正确性不被破坏

2、里氏替换原则可以用于哪些设计模式中?

将里氏替换原则应用于设计模式中,它可以用在许多设计模式中,例如:

  1. 工厂模式:子类可以替换父类,而不会影响到工厂的实现。
  2. 策略模式:不同的策略可以被替换,而不会影响到程序的正确性。
  3. 装饰器模式:装饰器可以替换被装饰的对象,而不会破坏程序的可扩展性。
  4. 模板方法模式:子类可以被使用来扩展或修改模板方法,而不会影响到程序的正确性。

总之,里氏替换原则是一个通用的设计原则,可以在许多设计模式中使用,以增强程序的可读性、可维护性和可扩展性。

3、如何使用里氏替换原则来降低代码耦合度?

通过遵循里氏替换原则,可以使得代码更加灵活、可扩展、易维护。下面是几种具体的方法来降低代码耦合度:

  1. 使用接口而不是具体的类:对于一个类,尽可能使用其接口而非具体的实现。这样可以减少对具体实现的依赖,并且可以更容易地替换实现。
  2. 将通用的行为移到基类:将一些通用的方法或属性移动到基类中,这样子类就可以继承这些方法并添加自己的实现,而不是每个子类都去重复实现相同的方法。
  3. 使用抽象类或接口来表示通用行为:通过使用抽象类或接口来表示通用行为,可以使得代码更加灵活和可扩展。当需要添加新的特定行为时,只需要实现新的抽象类或接口即可,而不需要修改已有的代码。
  4. 避免破坏子类的先决条件:子类必须满足其父类的先决条件。如果子类修改了父类的行为,那么子类就不能替代其父类,这会导致代码的耦合度增加。

4、违反里氏替换原则的反模式

在设计子类时,要遵守父类的行为约定(或者为协议)
以下是违反里氏替换原则的例子:

  1. 子类违反父类声明要实现的功能
  2. 子类违反父类对输入、输出和异常约定
  3. 子类违反父类注释中罗列的任何特殊说明

5、案例解读

假设我们有一个License类,其结构如图1所示。该类中有一个名为calcFee的方法,该方法将由 Billing应用程序来调用。而License类有两个子类型:PersonalLicense与BusinnessLicense,这两个类会用不同的算法来计算授权费用。
深入理解设计原则之里氏替换原则(LSP)【软件架构设计】

图1:License类与其衍生类,体现了LSP原则

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

正方形/长方形问题是一个著名的违反LSP设计原则的案例,该问题结构如图2所示。
深入理解设计原则之里氏替换原则(LSP)【软件架构设计】

图2:正方形/长方形问题,违反了LSP原则
在这个案例中,Square类并不是Rectangle类的子类型,因为Rectangle类的高和宽可以分别修改,而Square类的高和宽则必须一同修改。由于User类始终认为自己在操作Rectangle类,因此会带来一些混淆。例如在下面的代码中:
Rectangle r = ...
r.setW(5);
r.setH(2);
assert(r.area() == 10);

很显然,如果上述代码在…处返回的是Square类,则最后assert是不会成立的。

6、里氏替换原则与多态的区别

多态是一种代码实现思路,而里氏替换原则是一种设计原则,用来指导继承关系中子类的设计:在替换父类时,确保不改变程序原有的逻辑行为,以及不破坏程序的正确性。

7、小结

里氏替换原则存在的意义:文章来源地址https://www.toymoban.com/news/detail-470856.html

  • 提高代码的可维护性。遵循里氏替换原则可以使代码的结构更加清晰,如果程序中的对象可以互相替换,那么维护代码的时候就能够更方便地进行修改和扩展。
  • 提高代码的可扩展性。遵循里氏替换原则,可以使代码更容易扩展。如果代码中的对象可以互相替换,那么新的子类可以很容易地替换已有的类,从而实现代码的扩展,而不需要修改原有的代码。
  • 增加代码的可读性。如果遵循里氏替换原则,代码中的类之间的关系会更加清晰明了,这对于其他开发人员来说也更容易理解和阅读。
  • 提高代码的健壮性。遵循里氏替换原则可以使程序更加健壮。如果程序中的对象可以互相替换,那么程序的稳定性和可靠性也会得到提高。
  • 促进代码重用。遵循里氏替换原则,可以使代码更容易重用。如果程序中的对象可以互相替换,那么可以将已有的对象用于新的场景中,从而避免了重复编写代码的情况。

到了这里,关于深入理解设计原则之里氏替换原则(LSP)【软件架构设计】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Java 设计模式】设计原则之里氏替换原则

    在软件开发中,设计原则是创建灵活、可维护和可扩展软件的基础。 这些原则为我们提供了指导方针,帮助我们构建高质量、易理解的代码。 ✨单一职责原则(SRP) ✨开放/封闭原则(OCP) ✨里氏替换原则(LSP) ✨依赖倒置原则(DIP) ✨接口隔离原则(ISP) ✨合成/聚合复

    2024年01月20日
    浏览(27)
  • 设计模式——里氏替换原则

    继承包含这样一层含义:父类中凡是已经实现好的方法,实际上是在设定规范和契约,虽然它不强制要求所有的子类必须遵循这些契约,但是如果子类对这些已经实现的方法任意修改,就会对整个继承体系造成破坏。 继承在给程序设计带来便利的同时,也带来了弊端。比如使

    2024年02月11日
    浏览(36)
  • 设计模式:里氏替换原则(详解)

    本博主将用CSDN记录软件开发求学之路上亲身所得与所学的心得与知识,有兴趣的小伙伴可以关注博主!也许一个人独行,可以走的很快,但是一群人结伴而行,才能走的更远! (1)引入 继承包含这样一层含义:父类中凡是已经实现好的方法, 实际上是在设定规范和契约 ,

    2024年02月06日
    浏览(26)
  • 基于面向对象基础设计——里氏替换原则

    在Java中,支持抽象和多态的关键机制之一是继承。正是使用了继承,我们才可以创建实现父类中抽象方法的子类。那么,是什么规则在支配着这种特殊的继承用法呢?最佳的继承层次的特征又是什么呢?在什么情况下会使我们创建的类层次结构掉进不符合开闭原则的陷阱中呢

    2024年02月14日
    浏览(32)
  • 设计模式(四):里氏替换原则(详解)

    本博主将用CSDN记录软件开发求学之路上亲身所得与所学的心得与知识,有兴趣的小伙伴可以关注博主!也许一个人独行,可以走的很快,但是一群人结伴而行,才能走的更远! (1)引入 继承包含这样一层含义:父类中凡是已经实现好的方法, 实际上是在设定规范和契约 ,

    2024年02月05日
    浏览(32)
  • 深入理解Kafka:架构、设计原则及最佳实践

    Kafka是一款由Apache开发的分布式流处理平台,它最初是由LinkedIn公司在2010年开发的。从最初的消息队列到如今的分布式流处理平台Kafka经历了一个逐步演化的过程。 Kafka最开始的设计目的是解决LinkedIn内部存在的海量数据传输问题,在其不断的发展中Kafka逐渐发展成为一种可持

    2024年02月07日
    浏览(46)
  • 里式替换原则(LSP)

    目录 简介: 作用: 过程: 总结: 里式替换原则(Liskov Substitution Principle,简称LSP)的提出者是美国计算机科学家Barbara Liskov。Barbara Liskov是一位计算机科学家,麻省理工学院教授,也是美国第一个计算机科学女博士,师从图灵奖得主John McCarthy教授,人工智能概念的提出者。她在

    2024年02月11日
    浏览(24)
  • 里氏替换原则

    里氏替换原则 OOP(Object Oriented Programming) 面向对象编程 OO中的继承性的思考 1.继承包含这样一层含义,父类中凡是已经写好的方法,实际上就是设定规范。虽然不强制要求所有子类必须遵守规范(不重写方法),但是如果子类对这些方法,任意修改就会对继承体系造成破坏。 2.继

    2024年02月11日
    浏览(29)
  • 架构师日记-深入理解软件设计模式

    作者:京东零售 刘慧卿 设计模式(Design pattern) :由软件开发人员在软件开发中面临常见问题的解决方案,是经过长时间的试验积累总结出来的,它使设计更加灵活和优雅,复用性更好。从实用的角度来看,它代表了某一类问题的最佳实践。 设计模式到底解决了开发过程中

    2024年02月02日
    浏览(32)
  • 深入理解设计模式:设计模式定义、设计原则以及组织编目

    软件领域的设计模式起源主要是受到1977年建筑大师Alexander出版的《A Pattern Language:Towns, Building, Construction》一书。Alexander在其著作中将其建筑行业中的许多问题的最佳解决方案记录为200多种模式,其思想不仅在建筑行业影响深远,而且很快影响到了软件设计领域。 1987年,K

    2024年02月14日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包