里氏替换原则(Liskov Substitution Principel)是解决继承带来的问题。

继承的优点:

  • 代码共享,减少创建类的工作量,每个子类都拥有父类的方法和属性;
  • 提高代码的重用性;
  • 子类可以形似父类,但又异于父类;
  • 提高代码的可扩展性;
  • 提高产品或项目的开放性。

继承的缺点:

  • 继承是侵入性的,只要继承就必须拥有父类的所有属性和方法;
  • 降低代码的灵活性,子类必须拥有父类的属性和方法,让子类增加了约束;
  • 增强了耦合性,当父类的常量、变量和方法被修改时,必须考虑子类的修改。

定义:

所有引用基类的地方必须能透明地使用其子类的对象。

通俗点讲,只要父类能出现的地方子类就可以出现,而且替换为子类也不会产生任何错误或异常,使用者可能根本就不需要知道是父类还是子类。但是,反过来就不行了,有子类出现的地方,父类未必就能适应。

含义:

  • 子类必须完全实现父类的方法

在类中调用其他类时务必要使用父类或接口,如果不能使用父类或接口,则说明类的设计已经违背了里氏替换原则。

如果子类不能完整地实现父类的方法,或者父类的某些方法在子类中发生了“畸变”,则建议断开父子继承关系,采用依赖、聚集、组合等关系代替继承。

  • 子类可以有自己的个性
  • 覆盖或实现父类的方法时输入参数可以被放大

如果子类的前置条件较小,子类在没有覆写父类的方法的前提下,子类方法被执行了,这会引起业务逻辑混乱,因为在实际应用中父类一般都是抽象类,子类是实现类,你传递一个这样的实现类就会“歪曲”了父类的意图,引起一堆意想不到的业务逻辑混乱。

  • 覆盖或实现父类的方法时输出结果可以被缩小

目的:

采用里氏替换原则的目的就是增强程序的健壮性,版本升级是也可以保持非常好的兼容性。即使增加子类,原有的子类还可以继续运行。在实际项目中,每个子类对应不同的业务含义,使用父类作为参数,传递不同的子类完成不同的业务逻辑。

Java设计原则—里氏替换原则(转)的更多相关文章

  1. 面向对象设计原则 里氏替换原则(Liskov Substitution Principle)

    里氏替换原则(Liskov Substitution Principle LSP)面向对象设计的基本原则之一. 里氏替换原则中说,任何基类可以出现的地方,子类一定可以出现. LSP是继承复用的基石,只 ...

  2. 设计模式值六大原则——里氏替换原则(LSP)

    里氏替换原则(Liskov Substitution Principel)是解决继承带来的问题. 继承的优点: 代码共享,减少创建类的工作量,每个子类都拥有父类的方法和属性: 提高代码的重用性: 子类 ...

  3. java《设计原则-里氏替换原则》

    package dubbo.wangbiao.project.ThreadAndSocket.designprinciples.lishitihuanyuanze.k0; //长方形 public c ...

  4. 【C#设计模式】里氏替换原则

    今天,我们再来学习 SOLID 中的"L"对应的原则:里式替换原则. 里氏替换原则 里氏替换原则(Liskov Substitution Principle):派生类(子类)对象能 ...

  5. 第2章 面向对象的设计原则(SOLID):2_里氏替换原则(LSP)

    2. 里氏替换原则(Liskov Substitution Principle,LSP) 2.1 定义 (1)所有使用基类的地方必须能透明地使用子类替换,而程序的行为没有任何变化(不会产生运行结果错误 ...

  6. 【面向对象设计原则】之里氏替换原则(LSP)

    里氏代换原则由2008年图灵奖得主.美国第一位计算机科学女博士Barbara Liskov教授和卡内基·梅隆大学Jeannette Wing 教授于1994年提出,所以使用的是这位女博士的性命名的一个 ...

  7. 六大设计原则(二)LSP里氏替换原则

    里氏替换原则LSP(Liskov Subsituation Principle) 里氏替换原则定义 所有父类出现的地方可以使用子类替换并不会出现错误或异常,但是反之子类出现的地方不一定能用父类替换. ...

  8. 面向对象设计原则三:里氏替换原则(LSP)

    里氏替换原则(LSP)定义:在任何父类出现的地方都可以用它的子类类替换,且不影响功能.解释说明:其实LSP是对开闭原则的一个扩展,在OO思想中,我们知道对象是由一系列的状态和行为组成的,里氏替换原则说 ...

  9. Java设计模式(4:里氏替换原则和合成复用原则详解

    一.里氏替换原则 如果说实现开闭原则的关键步骤就是抽象化,那么基类(父类)和子类的继承关系就是抽象化的具体实现,所以里氏替换原则就是对实现抽象化的具体步骤的规范.即:子类可以扩展基类(父类)的功能,但 ...

随机推荐

  1. 将execel表格的数据导入到mysql数据库

    在开发中经常会将现成的execel表格导入到数据库里,否则一个个字段插入填写,太浪费时间,效率很低.本文主要是讲如果将execel表格导入到mysql数据库,希望对各位有所帮助.使用软件:sql工具: ...

  2. [WPF]实现密码框的密码绑定

    正如绑定TextBox控件的Text属性一样, 我们希望能够将PasswordBox空间的Password属性进行绑定, 比如在MVVM模式中,这似乎是必须的, 但可惜的是, Password属性是不 ...

  3. Laravel5.1 搭建博客 --构建标签

    博客的每篇文章都是需要有标签的,它与文章也是多对多的关系 这篇笔记也是记录了实现标签的步骤逻辑. 在我们之前的笔记中创建了Tag的控制器和路由了 所以这篇笔记不在重复 1 创建模型与迁移文件 迁移文件 ...

  4. 2015 DevOps状态调查报告

    依据Puppet Labs的2015 DevOps调查报告(下载地址:https://puppetlabs.com/2015-devops-report),调查研究表明: 拥有强IT服务绩效的企业一般 ...

  5. 让iOS应用支持不同版本的系统与设备

    本文转载至  http://blog.csdn.net/pucker/article/details/11980811 最近一直在做app的iOS 6和7的同时适配工作,所以在此介绍一下系统与设备的兼 ...

  6. php实现简单的权限管理

    今天主要来实现一个权限管理系统,它主要是为了给不同的用户设定不同的权限,从而实现不同权限的用户登录之后使用的功能不一样,首先先看下数据库 总共有5张表,qx_user,qx_rules和qx_jues ...

  7. JZOJ.5327【NOIP2017模拟8.21】四驱兄弟

    Description

  8. [分享] 关于App Store下载到一半发生错误的问题 [复制链接]

    问题:昨天发现Pages无法更新,结果卸载在App Store里重新下载.下载到快结束的时候,提示“发生错误”,同时提示“在‘已购’中再试一次”.结果在已购中,Pages显示的是安装按钮,点击安装,显 ...

  9. [Gradle] 针对不同的项目类型应用不同的 findbugs 配置

    build.gradle in project root subprojects { subProject -> plugins.withId('com.android.application' ...

  10. 目前最火的php框架

    1.yii 作者:宗霖链接:https://www.zhihu.com/question/25023032/answer/75085250来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业 ...