首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

里氏替换原则

设计模式六大原则之二:里氏替换原则 简介 姓名 :里氏替换原则 英文名 :Liskov Substitution Principle 座右铭 : 1....老爹开车,前方注意 里氏替换原则定义了什么是父子,还有一点要注意的,就是儿子不能在父亲会的技能上搞“创新”。...我们上面说过,所有在使用父亲的地方,都能够替换成儿子,并且效果是一样的,那接下来我们改一下代码。 ? 结果是啥?打印出:红烧糖醋排骨,出乎意料吧。。。这结果完全不一样。...所以说里氏替换原则就是在定义父子关系,大家都遵守这个定义,就会一代比一代好,不遵守大家也看到了,把前辈传下来的都毁于一旦了。...(来自《设计模式之禅》) 总结 好了,里氏替换原则的大概原理讲得差不多,大家只要记住是在定义“父子关系”,就像游戏规则一样,定义后让大家遵守,会让大家的程序在后面越来越复杂的时候也能清晰,而不会越来越乱

53230
您找到你想要的搜索结果了吗?
是的
没有找到

java设计原则--里氏替换原则

也就是说子类继承了父类就必须拥有父类所有的属性和方法 缺点二:灵活性降低,子类必须拥有父类的属性和方法,让子类多了些约束 缺点三:增强了耦合性,当父类的常量、变量和方法被修改时需要考虑子类的修改 里式替换作用...Java的单继承机制从总体上看是利大于弊,那么,如何让利的优势发挥最大,同时减少弊的带来的麻烦呢,于是就有了里式替换原则里氏替换原则为良好的继承定义了一个规范 我们在做系统设计时,经常会定义一个接口或抽象类...,然后编码实现,调用类则直接传入接口或抽象类,其实这里已经使用了里氏替换原则 举一个CS的案例: 枪的主要职责是射击,如何射击在各个具体的子类中定义,手枪是 单发射程比较近,步枪威力大射程远,机枪用于扫射...注意 在类中调用其他类时务必要使用父类或接口,如果不能使 用父类或接口,则说明类的设计已经违背了LSP原则 本文内容参考设计模式之禅,仅用于个人学习,如有不妥请联系删除

82320

模式-“里氏替换原则

大家好,又见面了,我是全栈君 里氏替换原则是,同组的有类的两个子类,在使用子类A这个地方(方法/属性)您可以使用子类 B代替.对于面向接口编程,我只需要确保同样的行为代码;基类的所有子类必须全部...Concrete c); 策略模式:一般,我们把解决某个问题的方法称为一个”算法”,而把解决一类问题的算法封装 成一个接口,那么实现算法的多种方式作为子类;在某个时候,在调用中我们使用算法A替换...算法B,这就是策略模式在里氏代换原则中的应用; ***************策略模式************************************ >准备一组算法,并将每个封装起来使的他们能够互换...v.add("New"); } } *********************************************************** 合成模式:上面两中模式都是里氏代换原则在方法方面的应用...这是与里氏代换原则; *********************************************************** 发布者:全栈程序员栈长,转载请注明出处:https://

27321

设计模式原则里氏替换原则

里氏替换原则 里氏替换原则表示如果对每一个类型为 S 的对象 o1 都有类型为 T 的对象 o2 ,使得以 T 定义的所有程序 P 在所有的对象 o1 都代换成 o2 时 ,程序 P 的行为没有发生变化...也就是说,在程序中可以将子类对象替换父类对象,而程序逻辑不变。 里氏替换原则是继承复用的基础,它体现了子类和父类之间的关系。...如果一个软件能够遵循里氏替换原则,那么它就具有以下两个优点: 保证了父类的抽象性和可复用性,子类可以扩展父类的功能,但不会破坏父类的约束和规范。...这个类就违反了里氏替换原则,因为它改变了父类的行为含义,使得在程序中无法将 Bird 对象替换 Animal 对象,而不改变程序的逻辑。...extends Animal { @Override public void run() { System.out.println("鸟可以飞行"); } } 为了遵循里氏替换原则

15230

设计模式 -- 里氏替换原则

表述(不要破坏继承体系) 子类可以替换父类的位置.并且程序的功能不受影响(当一个父类指针指向一个子类对象的时候,这里就有里氏替换原则) 优点 代码共享,减少创建类的工作量,每个子类都拥有父类的所有属性和方法...若子类覆盖了父类,父类出现的地方,用子类替换父类,最终调用的却是子类中方法,这就违反了里氏替换原则 因为父类出现的地方,调用的肯定是父类的中方法,若用子类替换,调用的还是父类中的方法或者是子类实现父类中抽象方法...(满足父类功能约束),这才符合里氏替换原则 示例 需求:员工的工资计算,刚开始,我们会新建一个员工类,类中有一个计算工资的方法 class Employee{ func calculateSalary

9810

设计模式-里氏替换原则

设计模式-里氏替换原则 优点 面向对象的语言继承必不可少的,有如下优点 代码共享,减少创建类的工作量 提高代码的重用性 提高代码的可扩展性 提高代码的可扩展性 提高产品代码的开放性 继承侵入性 只要继承...提供规范 里氏替换原则,为继承定义规范。...长方形是不是正方形 正方形是一种特殊的长方形,如果将正方形设计为长方形的子类,不符合里氏替换原则 下方有三个类 类图如下 [2.png] 关系如上所示 package demo1; public class...所以上面的栗子不符合里氏替换原则。 解决方法,使用继承时,要遵守里氏替换原则,类B继承类A时,不要重写父类A的方法,也不能重载父类A的方法。...总结 里氏替换原则;父类可以的地方,换成子类也同样可以。

45100

设计模式—–里氏替换原则

里氏替换原则 开放封闭原则(Open Closed Principle)是构建可维护性和可重用性代码的基础。...里氏替换原则(LSP: The Liskov Substitution Principle) 使用基类对象指针或引用的函数必须能够在不了解衍生类的条件下使用衍生类的对象。...正方形和长方形,违背原则的微妙之处 很多情况下对 LSP 原则的违背方式都十分微妙。...为了仍然遵守 LSP 原则,并同时符合 OCP 原则,所有的衍生类必须符合使用者所期待的基类的行为。...里氏替换原则 则是实现 OCP 原则的重要方式。只有当衍生类能够完全替代它们的基类时,使用基类的函数才能够被安全的重用,然后衍生类也可以被放心的修改了。

87030

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

简介 里氏替换原则是在做继承设计时需要遵循的原则,不遵循了 LSP 的继承类会带来意想不到的问题。...定义 里氏替换原则(Liskov Substitution Principle) 是由 Barbara Liskov 在 1987 年提出来的,Liskov 是她的姓,国内翻译成 里氏。...从契约角度来看,里氏替换原则有4层含义: 方法的前置条件要求不能更严格(可以更宽松) 方法的后置条件不能更宽松(可以更严格) 子类要保持父类约定的不变性 历史约束。...在以前写的一篇里氏替换原则 的文章里,我提到过: 每个类都会有public方法,有些类会实现interface,供其他类使用,自身就处在一个服务的位置上。...String name){ this.name = name; } } public interface Flyable { public void fly(); } 总结 里氏替换原则是继承需要遵循的原则

1.2K40

面向对象设计原则-里氏替换原则

里氏替换原则(Liskov Substitution Principle,LSP)是面向对象设计中的一个重要原则,它由Barbara Liskov提出。...这个原则的基本思想是,派生类必须能够完全替换其基类。也就是说,子类对象能够在不改变程序正确性的前提下,替换掉父类对象。这个原则的目的是帮助设计师避免在使用继承时可能会出现的错误和问题。...下面将详细介绍LSP以及如何在Java中应用该原则。LSP的定义LSP原则的正式定义是:“如果S是T的一个子类型,那么S对象可以替换T对象,而程序执行的结果不会发生变化。”...(3)提高程序的可扩展性如果我们遵循LSP原则,那么我们就可以轻松地在程序中添加新的子类,而不需要修改原有的代码。这样可以提高程序的可扩展性,使其更加灵活。...这就是LSP原则的体现。

22510

Java设计原则里氏替换原则(转)

里氏替换原则(Liskov Substitution Principel)是解决继承带来的问题。...通俗点讲,只要父类能出现的地方子类就可以出现,而且替换为子类也不会产生任何错误或异常,使用者可能根本就不需要知道是父类还是子类。但是,反过来就不行了,有子类出现的地方,父类未必就能适应。...含义: 子类必须完全实现父类的方法 在类中调用其他类时务必要使用父类或接口,如果不能使用父类或接口,则说明类的设计已经违背了里氏替换原则。...覆盖或实现父类的方法时输出结果可以被缩小 目的: 采用里氏替换原则的目的就是增强程序的健壮性,版本升级是也可以保持非常好的兼容性。即使增加子类,原有的子类还可以继续运行。

29910

软件架构设计原则--里氏替换原则

本专栏内容参考自:咕泡学院Tom老师的《Spring5核心原理与30个类手写实战》,仅作个人学习记录使用,如有侵权,联系速删   里氏替换原则(Liskov Substitution Principle...使用里氏替换原则有以下优点: 约束继承泛滥,这是开闭原则的一种体现。 加强程序的健壮性,同时变更时也可以做到非常好的兼容性,提高程序的可维护性和扩展性,降低需求变更时引入的风险。   ...用一个经典的业务场景:用正方形、矩形、和四边形的关系说明里氏替换原则,我们都知道正方形是一个特殊的长方形,所以可以创建一个父类Rectangle: public class Rectangle {...square = new Square(); square.setLength(10); resize(square); }   对已有功能造成了影响,违背里氏替换原则...里氏替换原则只存在于父类和子类之间,约束继承泛滥。

29830

设计模式——二:里氏替换原则

什么是里氏替换原则?Why里氏替换原则?...为了扬长避短,就有必要引入里氏替换原则。...里氏抽丝剥茧 里氏替换原则包含了四层含义: * 子类必须完全实现父类的方法 在做系统设计时,经常会定义一个接口或抽象类,然后编码实现,调用类则直接传 入接口或抽象类,其实这里已经使用了里氏替换原则。...里氏替换原则也要求制定一个契约,就是父类或接口,这种设计方法也叫做 Design by Contract(契约设计),与里氏替换原则有着异曲同工之妙。...参考: 【1】:《设计模式之禅》 【2】:里氏替换原则(The Liskov Substitution Principle) 【3】:设计模式六大原则(2):里氏替换原则 【4】:《大话设计模式》

41420

6大设计原则里氏替换原则

里氏替换原则的规范(继承的规范) 1.子类必须完全实现父类的方法 例如有一个打枪的游戏,类图如下 ? 其 Soldier 代码如下 ?...注意: 在类中调用其他类时,要使用父类或接口,否则就违背了里氏替换原则 这时,如果有一个玩具枪 ToyGun, 继承自 AbstractGun,显然是不合适的,因为玩具枪没有伤害,可以新建一个抽象类 AbstractToy...4.覆写或实现父类的方法是输出结果可以被缩小 这个也不难理解,也就是说父类方法返回的是Map时,子类可以返回HashMap 但是反过来,父类返回的是HashMap,而子类返回Map类型就违背了里氏替换原则...采用里氏替换原则的好处 增强程序的健壮性,版本升级是也可以保持非常好的兼容性.即使增加子类,原有的子类还可以继续运行.在实际项目中,每个子类对应不同的业务含义,使用父类作为参数,传递不同的子类完成不同的业务逻辑...---- 采用里氏替换原则,应尽量避免子类的"个性",一旦子类有"个性",这个子类和父类之间的关系就很难调和了,把子类当作父类使用,将子类的"个性"抹杀;把子类单独作为一个业务来使用,会让代码间的耦合关系变得扑朔迷离

49320

面向对象的设计原则-里氏替换原则

"里氏替换原则"是类的设计原则之一,我们使用"3H"学习法对其进行拆解; why(目的):为什么要学习"里式替换原则",我们都知道面向对象的三大特性:封装、继承、多态,该原则就是对良好的"继承关系..."定义了一些规范,通过学习理解后可以写出更健壮、更具扩展性的程序; how(方法):怎么学习"里氏替换原则",方式很多:比如看书、上网找资料,先理解概念,然后实践代入场景,最后输出理解; what...(本质):"里式替换原则"到底是什么?...LSP经典例子:正方形和长方形不符合里式替换,设置宽、高后,长方形的体积=宽*高,正方形体积=高*高,子类无法替换父类,不符合里氏替换原则; 在策略模式中,客户端类依赖抽象父类,场景类使用时传入具体的策略子类...,子类都实现了父类的抽象接口,可以互换,这就符合里式替换原则

82830

编码最佳实践——里氏替换原则

Liskov替换原则(Liskov Substitution Principle)是一组用于创建继承层次结构的指导原则。...按照Liskov替换原则创建的继承层次结构中,客户端代码能够放心的使用它的任意类或子类而不担心所期望的行为。...Liskov替换原则定义 如果S是T的子类型,那么所有的T类型的对象都可以在不破坏程序的情况下被S类型的对象替换。 基类型:客户端引用的类型(T)。...Liskov替换原则的规则 要应用Liskov替换原则就必须遵守两类规则: 1.契约规则(与类的期望有关) 子类型不能加强前置条件 子类型不能削弱后置条件 子类型必须保持超类型中的数据不变式 2.变体规则...最后 Liskov替换原则是SOLID原则中最复杂的一个。需要理解契约和变体的概念才可以应用Liskov替换原则编写具有更高自适应能力的代码。

1.2K20

设计模式(二):里氏替换原则

什么是里氏替换原则? 定义:所有引用父类的地方必须能透明地使用其子类的对象。 为什么要有里氏替换原则?...里氏替换原则主要阐述了关于面向对象继承的一些原则,也就是什么时候应该使用继承,什么时候不应该使用继承,以及其中蕴含的原理。里氏替换原是继承复用的基础,它反映了父类与子类之间的关系。...里氏替换原则具有以下优点: 为良好的继承定义了一个规范; 提高代码的健壮性,降低程序出错的可能性; 里氏替换原则的四个原则 1、子类必须实现父类的抽象方法,但不得重写父类的非抽象方法 举例说明重写父类的非抽象方法的后果...所以凡是鸟父类出现的地方,都可以使用啄木鸟类替换,反过来就不行,因为鸟父类没有啄木的技能。从里氏替换原则来看,就是有子类出现的地方父类未必就可以出现。...,输出结果不一致,违反了里氏替换原则中 父类出现的地方子类也能出现的概念,使得程序出现不便排查的错误。

57100

java设计模式3,里氏替换原则

一、里氏替换原则定义 在面向对象的程序设计中,里氏替换原则(Liskov Substitution principle)是对子类型的特别定义。...里氏替换原则的内容可以描述为: “派生类(子类)对象可以在程序中代替其基类(超类)对象。” 以上内容并非利斯科夫的原文,而是译自罗伯特·马丁(Robert Martin)对原文的解读。...二、里氏替换原则的作用 里氏替换原则是实现开闭原则的重要方式之一; 解决了继承中重写父类造成的可复用性变差的问题; 是动作正确性的保证,即类的扩展不会给已有的系统引入新的错误,降低了出错的可能性。...此时继承父类实现的敖丙并不满足里氏替换原则,也就是说,此时的子类不能承担原父类的功能,直接给哪吒用,因为称号、师傅、混元珠也都也不一样嘛。...如果使用了继承,就一定要遵从里氏替换原则,否则会让代码出现问题的概率变大。 版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。

63230
领券