里氏置换原则定义:所有引用基类的地方必须能够透明的使用其子类对象。

也就是说,只要父类出现的地方子类就能够出现,而且替换为子类不会产生任何错误或异常。但是反过来,子类出现的地方,替换为父类就可能出现问题了。

这个原则是为良好的继承定义一个规范,简单的讲,有4层含义:

一、子类必须完全实现父类的方法 --定义一个抽象类
public abstract class ViewPoint {
//去丽江旅游
public abstract void where();
}
下面两个类是实现这个抽象类

public class Lijiang extends ViewPoint {
@Override
public void where() {
System.out.println("欢迎来到丽江...");
}
}

public class Zhangjiajie extends ViewPoint {
@Override
public void where() {
System.out.println("欢迎来到张家界...");
}
}
人物是涂涂,在里面设置类类型来传递参数。此时涂涂要去的旅游景点还是抽象的

public class Tutu {
//定义要旅游的景点
private ViewPoint viewpoint;
//涂涂要去的景点
public void setViewPoint(ViewPoint viewpoint)
{
this.viewpoint = viewpoint;
}

public void travelTo()
{
System.out.println("涂涂要去旅游了");
viewpoint.where();
}
}
场景类。设置具体要去的景点
public class Sence {
public static void main(String args[])
{
Tutu tutu = new Tutu();
//设置要去的旅游景点
tutu.setViewPoint(new Lijiang());
tutu.travelTo();
}
}

二、子类可以有自己的特性

也就是说在类的子类上,可以定义其他的方法或属性

三、覆盖或者实现父类的方法时输入参数可以被放大

父类能够存在的地方,子类就能存在,并且不会对运行结果有变动。反之则不行。

父类,say()里面的参数是HashMap类型,是Map类型的子类型。(因为子类的范围应该比父类大)

import java.util.Collection;
import java.util.HashMap;

public class Father {
public Collection say(HashMap map)
{
System.out.println("父类被执行...");
return map.values();
}
}
子类,say()里面的参数变成了Map类型,Map范围比HashMap类型大,符合LSP原则。注意这里的say不是覆写父类的say,因为参数类型不同。而是重载。

import java.util.Collection;
import java.util.Map;
/*
* 子类继承了父类的所有属性
*/
public class Son extends Father {
//方法输入参数类型
public Collection say(Map map)
{
System.out.println("子类被执行...");
return map.values();
}
}
场景类

import java.util.HashMap;

public class Home {
public static void main(String args[])
{
invoke();
}

public static void invoke()
{
//父类存在的地方,子类就应该能够存在
//Father f = new Father();
Son s = new Son();
HashMap map = new HashMap();
//f.say(map);
s.say(map);
}
}
无论是用父类还是子类调用say方法,得到的结果都是:父类被执行...

但是,如果将上面Father里的say参数改为Map,子类Son里的say参数改为HashMap,得到的结果就变成了

f.say(map)结果:父类被执行...
s.say(map)结果: 子类被执行...

这样会造成逻辑混乱。所以子类中方法的前置条件必须与父类中被覆写的前置条件相同或者更宽。

四、覆写或者实现父类的方法时输出结果可以被缩小
其实与上面的类似,也就是父类能出现的地方子类就可以出现,而且替换为子类不会产生任何错误或者异常,使用者也无需知道是父类还是子类。但是反过来就不行了,有子类出现的地方,父类未必就适应。(毕竟子类的范围要>=父类的范围)

设计模式原则之五:里氏置换原则相关推荐

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

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

  2. python里氏替换原则_设计模式六大原则之里氏替换原则

    这是设计模式6 大原则系列的第二篇文章,附上前一篇文章地址:设计模式六大原则之单一职责原则.本文主要讲解设计模式的里氏替换原则. 肯定有不少人跟我刚看到这项原则的时候一样,对这个原则的名字充满疑惑.其 ...

  3. 设计模式-设计原则之里氏代换原则

    设计原则之里氏代换原则 里氏代换原则 案例(正方形不是长方形) 案例改进 里氏代换原则 里氏代换原则是面向对象设计的基本原则之一. 里氏代换原则:任何基类可以出现的地方,子类一定可以出现. 通俗理解: ...

  4. 软件设计原则之里氏替换原则、依赖倒置原则

    系列文章目录 软件设计原则之单一职责原则.开闭原则 软件设计原则之里氏替换原则.依赖倒置原则 软件设计原则之接口隔离原则.合成复用原则.迪米特原则 文章目录 系列文章目录 一.里氏替换原则 什么是里氏 ...

  5. 带你认识六种设计原则(开闭原则、里氏代换原则、依赖倒转原则....)

    前言 1. 设计原则 1.1. 开-闭原则 1.2. 里氏代换原则 1.3. 依赖倒转原则 1.4. 接口隔离原则 1.5. 合成/聚合原则 1.6. 迪米特法则 前言 学习设计模式之前先要了解其中的 ...

  6. Java设计原则之单一职责原则、开闭原则、里氏代换原则

    文章目录 面向对象设计原则概述 单一职责原则 开闭原则 里氏代换原则 面向对象设计原则概述 软件的可维护性(Maintainability)和可复用性(Reusability)是两个非常重要的用于衡量 ...

  7. 七大设计原则之里氏替换原则应用

    目录 1 里氏替换原则 2 里氏替换原则应用 1 里氏替换原则 里氏替换原则(Liskov Substitution Principle,LSP)是指如果对每一个类型为 T1 的对象 o1,都有类型为 ...

  8. 6大设计原则之里氏替换原则

    面对对象中的继承 优点如下: 代码共享,减少创建类的工作量,每个子类都拥有父类的方法和属性 提高代码的重用性 子类可以形如父类,但又异于父类 提高代码的可扩展性,很多开源框架的扩展接口都是通过继承父类 ...

  9. 设计原则 单一职责原则、开放封闭原则、依赖倒置原则、里氏代换原则、迪米特法则

    目录 1 单一职责原则 2 开放封闭原则 3 依赖倒置原则 4 里氏代换原则 5 迪米特法则 1 单一职责原则 比如:电脑内存坏了就应该更换内存,不应该更换CPU (内存负责内存.CPU负责CPU) ...

最新文章

  1. keras和tensorflow使用 keras.callbacks.TensorBoard 可视化数据
  2. Struts和Sitemesh整合,实现多个装饰器
  3. Caused by: java.sql.SQLException: GC overhead limit exceeded处理百万数据出现的异常
  4. RSS接触 - RSS中的XML文档
  5. 代码的坏味道之一——译自《重构》
  6. 阿里云CentOS服务器挂载数据盘
  7. 小程序 ajax 加载,小程序实战-小程序网络请求异步加载
  8. linux tomcat启动nohup,linux下tomcat添加服务
  9. 使用linux集体升级系统,一:Linux系统的升级
  10. 运行maven项目抛出java.lang.OutOfMemeoyError异常
  11. PHP中常用的十个字符串函数
  12. Python日记 -- 百度OCR翻译
  13. pyinstaller打包指南,No module named xxx,is only available if OpenCV is installed.虚拟环境打包
  14. app架构图怎么做,价值2000元的学习资源泄露,实战篇
  15. 年薪30万IT精英 挥别都市回乡种田务农
  16. 安装deepin微信报错: dpkg: 依赖关系问题使得 deepin.com.wechat:i386 的配置工作不能继续 解决办法如下:
  17. 原型设计工具Axure RP9下载、中文语言操作说明(赠授权码)
  18. 小岳岳逗乐,林志玲亲临,看科技如何助力十一出游
  19. 使用正则表达式批量去除第一个逗号前的内容(含逗号)以及去除最后一个逗号后面的内容
  20. 在CloudFoundry上部署独立Java应用

热门文章

  1. mysql数据库运维_开源数据库MySQL DBA运维实战3
  2. ajax常见写法,jquery ajax较常见的写法
  3. python中组合数据类型、函数和代码复用的难点_Python电子教案5-2 函数和代码复用...
  4. antd vue关闭模态对话框_我不能没有的5个Vue.js库
  5. 2019年参加迅雷链宣讲会日记
  6. elasticsearch报错exceptions.RequestError(400, u'mapper_parsing_exception', u'No handler field..
  7. 剑指offer面试题[34]丑数
  8. 骆驼游戏 c语言,语言骆驼教案
  9. ig 焊接机器人_发那科机器人焊接应用的IO配置(总线型)
  10. phpfpm内存越来越高_内存时序越小越好,为什么DDR1到DDR4 时序值越来越高了?