文档章节

小菜学设计模式——里氏替换原则

learn_more
 learn_more
发布于 2015/05/28 09:21
字数 984
阅读 326
收藏 10

    背景

    本文标题为什么叫小菜学习设计模式,原因是本文内容主要是学习《大话设计模式》时的笔记摘要部分,当然,并不是记录书中小菜的学习过程,这个完全没有意义,而是指本人学习设计模式的成长之旅。

    真诚的希望自己能够从一名小菜成长为一名大鸟!

    编写的程序应该满足:

    1)可维护

    2)可扩展

    3)可复用

    4)够灵活

    废话少说,言归正传,设计模式原则之:里氏替换原则

    书面理解

    里氏替换原则:一个软件实体如果使用的是父类的话,那么一定适用与其子类,而且它察觉不出父类对象和子类对象的区别。也就是说,在软件里面,把父类都替换成它的子类,程序的行为没有变化。

    子类型必须能够替换掉他们的父类型。

    只有当子类可以替换其父类,软件单位的功能不受到影响,父类才能真正被调用,而子类也能够在父类的基础上增加新的行为。

    由于子类型的可替换性才使得使用父类类型的模块在无需修改的情况下就可以扩展,其实也就是对内关闭,对外开放。

    里氏替换原则其实是在诠释依赖倒转原则,依赖倒转可以说是面向对象设计的标志,用哪种语言编写程序不重要,如果编写时考虑的是如何针对抽象编程而不是针对具体细节编程,即使程中所有的依赖关系都是终止于抽象类或者接口,那就是面向对象的设计,否则就是面向过程化的设计。


    个人的理解

    里氏替换原则的意义在于面向对象的多态,以前觉得多态就是不同的表现形式,而且一直觉得重写的多态意义不大,反而觉得是重载的多态更加让人印象深刻。其实面向对象的三大特征之一的多态是非常有用的,尤其是重写,因为重写的多态是一种面向抽象,然而重载的多态其实是一种面向过程。重写是运行是才知道抽象的具体实现,重载是在程序编译时就已经决定了这个程序的具体执行。

    无论是依赖倒转还是里氏替换,二者其实都是建立在多态的基础上,通过调用通用一致的接口,然而具体的实现这是子类来完成,所以一来便于扩展,而来便于维护。

    里氏替换要求了:“所有的子类都是父类,但是父类却不一定是子类”,正是因为“子类是父类”,所以调用父类(统一)的时候,通过多态转到了子类的调用,那么依赖倒转原则才会显得有意义。

    那么,对于以后多个模块相互集成的时候,尽量使用接口集成,而不要依赖具体的类来完成。

    另外,说到里氏替换原则,请记住一个经典再经典不过的例子,那就是企鹅是鸟吗?生物学的角度企鹅是鸟,但是面向对象编程则企鹅不能继承鸟,原因是根据里氏替换原则,“子类就是父类”,鸟是可以飞的,但是企鹅不会飞,所以企鹅如果继承了鸟他就不满足里氏替换原则。

    





© 著作权归作者所有

learn_more
粉丝 93
博文 240
码字总数 210196
作品 0
深圳
程序员
私信 提问
迈向大牛的重要一步——掌握设计模式

IT职场的小菜经常有这样的疑问: 为什么一个相似的功能,大牛一会儿就搞定,然后悠闲地品着下午茶逛淘宝;而自己加班加点搞到天亮还做不完。 为什么用户提出需求变更后,大牛只需潇洒地敲敲键...

一枚Sir
2015/04/10
322
0
Java 23种设计模式 初步了解

总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接...

engeue
01/02
54
0
开篇:二十三种设计模式的通俗理解

本文为本次系列文章的第一篇,接下来,小编预计用一周的时间,带大家重新解读二十三中设计模式,如果你觉得本文对你有帮助的话,可以帮小编点一下“关注”,支持一下小编,谢谢! 一、设计模...

老道士
07/11
12
0
咕泡-spring中常用设计模式概述

设计模式就是经验之谈,供后人借鉴,解决一些具有代表性的问题 设计模式来源于生活,反过来帮助我们更好生活 设计模式提升代码的可读性、可扩展性、维护成本、复杂业务问题 千万不要死记硬背...

职业搬砖20年
2018/08/17
119
0
阿里P7大牛细说架构——设计模式专栏

设计模式介绍 对于有经验的开发人员,学习设计模式有助于我们找到在软件开发过程中所面临的问题的最佳解决方案。一直以来软件都是为了用来解决现实生活中遇到的复杂问题而存在,设计模式(D...

别打我会飞
2018/11/25
133
0

没有更多内容

加载失败,请刷新页面

加载更多

计算机实现原理专题--二进制减法器(二)

在计算机实现原理专题--二进制减法器(一)中说明了基本原理,现准备说明如何来实现。 首先第一步255-b运算相当于对b进行按位取反,因此可将8个非门组成如下图的形式: 由于每次做减法时,我...

FAT_mt
昨天
6
0
好程序员大数据学习路线分享函数+map映射+元祖

好程序员大数据学习路线分享函数+map映射+元祖,大数据各个平台上的语言实现 hadoop 由java实现,2003年至今,三大块:数据处理,数据存储,数据计算 存储: hbase --> 数据成表 处理: hive --> 数...

好程序员官方
昨天
7
0
tabel 中含有复选框的列 数据理解

1、el-ui中实现某一列为复选框 实现多选非常简单: 手动添加一个el-table-column,设type属性为selction即可; 2、@selection-change事件:选项发生勾选状态变化时触发该事件 <el-table @sel...

everthing
昨天
6
0
【技术分享】TestFlight测试的流程文档

上架基本需求资料 1、苹果开发者账号(如还没账号先申请-苹果开发者账号申请教程) 2、开发好的APP 通过本篇教程,可以学习到ios证书申请和打包ipa上传到appstoreconnect.apple.com进行TestF...

qtb999
昨天
10
0
再见 Spring Boot 1.X,Spring Boot 2.X 走向舞台中心

2019年8月6日,Spring 官方在其博客宣布,Spring Boot 1.x 停止维护,Spring Boot 1.x 生命周期正式结束。 其实早在2018年7月30号,Spring 官方就已经在博客进行过预告,Spring Boot 1.X 将维...

Java技术剑
昨天
18
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部