设计模式-里氏替换原则
设计模式-里氏替换原则
优点
面向对象的语言继承必不可少的,有如下优点
- 代码共享,减少创建类的工作量
- 提高代码的重用性
- 提高代码的可扩展性
- 提高代码的可扩展性
- 提高产品代码的开放性
- 继承侵入性 只要继承,必须拥有父类的内容
- 降低代码的灵活性,子类必须拥有父类的属性和方法
- 增强耦合性。
提供规范
里氏替换原则,为继承定义规范。
长方形是不是正方形
正方形是一种特殊的长方形,如果将正方形设计为长方形的子类,不符合里氏替换原则
下方有三个类
类图如下
关系如上所示
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
设计模式-里氏替换原则相关推荐
- 设计模式 里氏替换原则
设计模式 里氏替换原则 继续里氏替换原则. 上回栗子为正方形不能被长方形继承,这次,具体 子类必须实现父类的方法 类图 对具体代码进行实践 // 定义抽象类枪 public abstract clas ...
- 北风设计模式课程---里氏替换原则(Liskov Substitution Principle)
北风设计模式课程---里氏替换原则(Liskov Substitution Principle) 一.总结 一句话总结: 当衍生类能够完全替代它们的基类时:(Liskov Substitution P ...
- 《设计模式》杂记之里氏替换原则
在这篇博文中,我想把自己学习过的里氏替换原则一些好知识点分享给大家.首先我想把继承的一下优缺点给大家分享一下,然后再引出里氏替换原则吧!<?xml:namespace prefix = o ns ...
- 里氏替换原则——举例说明Java设计模式中的里氏替换原则
里氏替换原则--举例说明Java设计模式中的里氏替换原则 1. 前言 官方定义: 2. 举例说明 2.1 例子介绍 2.2 反例 2.2.1 类图说明 2.2.2 代码说明 2.2.3 测试 2.2. ...
- 设计模式六大原则之里氏替换原则、依赖倒置原则详解
设计模式六大原则--里氏替换原则.依赖倒置原则详解 1.里氏代换原则(Liskov Substitution Principle) 概念 顾名思义,该原则用于经常发生替换的地方,在Java中指的是实现 ...
- Java设计模式(03) -- 里氏替换原则
六大设计原则 单一职责原则定义:约定一个类应该有且仅有一个改变类的原因: 开闭原则定义:规定软件中的对象.类.模块和函数对扩展应该是开放的,但对于修改是封闭的,核心思想也可以理解为面向抽象编程. 里氏 ...
- 《设计模式》——里氏替换原则
先扯两句 原本是不想扯了的,因为很久没扯了也不知道该说写什么,可是这里氏替换原则东西实在是太多了,我看过都快一周了,但是每次想写博客的时候,都写几个字就扔下了,倒不是说书中的内容不够详细,只是如果都是 ...
- java设计模式3,里氏替换原则
目录 一.里氏替换原则定义 二.里氏替换原则的作用 三.违背原则场景 四.里氏替换原则改变代码 1.抽象人物类 2.哪吒子类 3.敖丙子类 五.关注公众号哪吒编程,回复1024,获取Java学习资料, ...
- 「设计模式」六大原则之三:里氏替换原则小结
文章目录 1.里式替换原则定义 2. 举例说明 示例1: 示例2: 3. 哪些代码明显违背了 LSP? 子类违背父类声明要实现的功能 子类违背父类对输入.输出.异常的约定 子类违背父类注释中所罗列的任 ...
最新文章
- 文件与文件夹课后作业
- Linux下C编程实战
- spring学习笔记06-spring整合junit(出现的问题,解决的思路)
- gnu screen的用法
- Android 开发笔记___Activity的生命周期
- day01初步接触python和环境的安装
- SQL Server 审计操作概念
- 微信小程序使用代码切换底部导航
- win10系统Jmeter下载安装详解
- 解决Vue3的undefined问题
- 关于 draw.io 矢量图 SVG 导出的研究
- 今日头条 爬虫 java_爬虫实例:今日头条爬虫
- 【重识云原生】第六章容器6.4.2.3节——Pod使用(下)
- 碧蓝航线服务器维护2020,《碧蓝航线》2020维护公告(5月14日10时)
- 计算机教师面试专业技能部分,教师招聘考试面试,专业技能测试考什么?全在这了...
- Mybatis-plus学习笔记
- LabVIEW异步调用VI
- 13、ListView 适配器
- python人脸检测怎么弄_如何通过python实现人脸识别验证
- 中睿天下积极签署《个人信息保护自律公约》,助力数字政府建设