设计模式-里氏替换原则

优点

面向对象的语言继承必不可少的,有如下优点

  1. 代码共享,减少创建类的工作量
  2. 提高代码的重用性
  3. 提高代码的可扩展性
  4. 提高代码的可扩展性
  5. 提高产品代码的开放性
  6. 继承侵入性 只要继承,必须拥有父类的内容
  7. 降低代码的灵活性,子类必须拥有父类的属性和方法
  8. 增强耦合性。

提供规范

里氏替换原则,为继承定义规范。

长方形是不是正方形

正方形是一种特殊的长方形,如果将正方形设计为长方形的子类,不符合里氏替换原则
下方有三个类
类图如下

关系如上所示

package demo1;public class SmartTest {/** 长方形的长增加超过宽* * @param r* */public void resize(Rectangle r) {while (r.getHeight() <= r.getWidth()) {r.setHeight(r.getHeight() + 1);}}
}
package demo1;
/** 定义一个长方形类* @author ming* */public class Rectangle {protected long width;    // 可以访问基类继承而来的,不能访问基类本身的,对同包内的可见,并且子类也可见protected long height;public void setWidth(long width) {this.width = width;}public long getWidth() {return this.width;}public void setHeight(long height) {this.height = height;}public long getHeight() {return this.height;}
}
package demo1;
/** 定义一个正方形类继承自长方形类* * @author ming* * */
public class Square extends Rectangle{public void setWidth(long width, long height) {this.width = width;this.height = height;}public long getWidth() {return width;}public void setHeight(long height, long width) {this.height = height;this.width = width;}public long getHeight() {return height;}
}

在上面的三块代码中,当调用SmartTest类的resize方法的时候,如果传入的是父类,那么将会可以的,如果传入的是子类,正方形,那么将会不可以的。
即。上方的为长方形行,正方形不行。
所以上面的栗子不符合里氏替换原则。
解决方法,使用继承时,要遵守里氏替换原则,类B继承类A时,不要重写父类A的方法,也不能重载父类A的方法。
如果代码更改如下更改
让其两个都共同定义同一个父类即可

其中最上层的类为两个类的抽象类。

改进如下

package com.ming;/** 定义一个四边形类,只有get方法set方法* @author ming* */
public abstract class Quadrangle {protected abstract long getWidth();protected abstract long getHeight();
}
package com.ming;public class Rectangle extends Quadrangle {private long width;private long height;public void setWidth(long width) {this.width = width;}public long getWidth() {return this.width;}public void setHeight(long height) {this.height = height;}public long getHeight() {return this.height;}
}
package com.ming;public class Square extends Quadrangle{private long width;private long height;public void setWidth(long width) {this.height = width;this.width = width;}public long getWidth() {return this.,width;}public void setHeight(long height) {this.height = height;this.width = height;}public long getHeight() {return this.height;}
}

在上方的图中,由于两个为平级关系,所以父类的地方,换成子类也都可以。

总结

里氏替换原则;父类可以的地方,换成子类也同样可以。

为什么要符合

一个栗子

package com.ming2;public class A {public int func1(int a, int b) {return a-b;}
}
package com.ming2;public class B extends A{public int func1(int a, int b) {return a+b;}public int func2(int a, int b) {return func1(a,b)+100;  // 调用func1}
}

在上方中,如果这样书写

package com.ming2;public class Client {public static void main(String[] args) {B b = new B();System.out.println(b.func1(100, 50));}
}

就违反了里氏替换原则,即子类能使用的时候,父类也必须能使用。

www.iming.info

设计模式-里氏替换原则相关推荐

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

    设计模式 里氏替换原则 继续里氏替换原则. 上回栗子为正方形不能被长方形继承,这次,具体 子类必须实现父类的方法 类图 对具体代码进行实践 // 定义抽象类枪 public abstract clas ...

  2. 北风设计模式课程---里氏替换原则(Liskov Substitution Principle)

    北风设计模式课程---里氏替换原则(Liskov Substitution Principle) 一.总结 一句话总结: 当衍生类能够完全替代它们的基类时:(Liskov Substitution P ...

  3. 《设计模式》杂记之里氏替换原则

    在这篇博文中,我想把自己学习过的里氏替换原则一些好知识点分享给大家.首先我想把继承的一下优缺点给大家分享一下,然后再引出里氏替换原则吧!<?xml:namespace prefix = o ns ...

  4. 里氏替换原则——举例说明Java设计模式中的里氏替换原则

    里氏替换原则--举例说明Java设计模式中的里氏替换原则 1. 前言 官方定义: 2. 举例说明 2.1 例子介绍 2.2 反例 2.2.1 类图说明 2.2.2 代码说明 2.2.3 测试 2.2. ...

  5. 设计模式六大原则之里氏替换原则、依赖倒置原则详解

    设计模式六大原则--里氏替换原则.依赖倒置原则详解 1.里氏代换原则(Liskov Substitution Principle) 概念 顾名思义,该原则用于经常发生替换的地方,在Java中指的是实现 ...

  6. Java设计模式(03) -- 里氏替换原则

    六大设计原则 单一职责原则定义:约定一个类应该有且仅有一个改变类的原因: 开闭原则定义:规定软件中的对象.类.模块和函数对扩展应该是开放的,但对于修改是封闭的,核心思想也可以理解为面向抽象编程. 里氏 ...

  7. 《设计模式》——里氏替换原则

    先扯两句 原本是不想扯了的,因为很久没扯了也不知道该说写什么,可是这里氏替换原则东西实在是太多了,我看过都快一周了,但是每次想写博客的时候,都写几个字就扔下了,倒不是说书中的内容不够详细,只是如果都是 ...

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

    目录 一.里氏替换原则定义 二.里氏替换原则的作用 三.违背原则场景 四.里氏替换原则改变代码 1.抽象人物类 2.哪吒子类 3.敖丙子类 五.关注公众号哪吒编程,回复1024,获取Java学习资料, ...

  9. 「设计模式」六大原则之三:里氏替换原则小结

    文章目录 1.里式替换原则定义 2. 举例说明 示例1: 示例2: 3. 哪些代码明显违背了 LSP? 子类违背父类声明要实现的功能 子类违背父类对输入.输出.异常的约定 子类违背父类注释中所罗列的任 ...

最新文章

  1. 文件与文件夹课后作业
  2. Linux下C编程实战
  3. spring学习笔记06-spring整合junit(出现的问题,解决的思路)
  4. gnu screen的用法
  5. Android 开发笔记___Activity的生命周期
  6. day01初步接触python和环境的安装
  7. SQL Server 审计操作概念
  8. 微信小程序使用代码切换底部导航
  9. win10系统Jmeter下载安装详解
  10. 解决Vue3的undefined问题
  11. 关于 draw.io 矢量图 SVG 导出的研究
  12. 今日头条 爬虫 java_爬虫实例:今日头条爬虫
  13. 【重识云原生】第六章容器6.4.2.3节——Pod使用(下)
  14. 碧蓝航线服务器维护2020,《碧蓝航线》2020维护公告(5月14日10时)
  15. 计算机教师面试专业技能部分,教师招聘考试面试,专业技能测试考什么?全在这了...
  16. Mybatis-plus学习笔记
  17. LabVIEW异步调用VI
  18. 13、ListView 适配器
  19. python人脸检测怎么弄_如何通过python实现人脸识别验证
  20. 中睿天下积极签署《个人信息保护自律公约》,助力数字政府建设

热门文章

  1. 猫猫学iOS 之微博项目实战(2)微博主框架-自己定义导航控制器NavigationController
  2. 转jmeter 性能测试 JDBC Request (查询数据库获取数据库数据) 的使用
  3. Tiny快速入门之服务开发
  4. python xlrd模块
  5. 用awk 取出ifconfig eth0中IP的方法
  6. Vim - 奇技淫巧
  7. 应用程序、虚拟目录、应用程序池
  8. mysql 插入数据乱码
  9. python+webdriver(三)
  10. C#类、接口、虚方法和抽象方法