设计模式一共有六大原则:

单一原则、开放封闭原则、接口分离原则、里氏替换原则、最少知识原则、依赖倒置原则。

这篇博客是自己对依赖倒转&里氏代换原则的一些拙见,有何不对欢迎大家指出。

依赖倒转原则

高层模块不应该依赖于低层模块,两者都应该依赖于抽象。

抽象不应该依赖细节,细节应该依赖抽象。

面向对象编程领域中,依赖反转原则(Dependency inversion principle,DIP)是指一种特定的解耦(传统的依赖关系创建在高层次上,而具体的策略设置则应用在低层次的模块上)形式,使得高层次的模块不依赖于低层次的模块的实现细节,依赖关系被颠倒(反转),从而使得低层次模块依赖于高层次模块的需求抽象。「来源于:wiki」

eg:

问题由来:

一个项目的数据库的链接,增删改查等会被复用,所以一般都会将其写成函数,这些函数被称为低层的函数。当我们调用这些函数的时候,高层次的代码就依赖于这些低层的函数。

当我们再次做一个新的项目的时候,发现高层的逻辑都是一样的,仅仅是需要更换数据库的存储。这个时候,因为我们的高层模块依赖于低层的函数,是没办法复用这些模块的。

现在去修改高层的代码会有很大的风险。

解决方案:

设置一个接口或者抽象类,让低层的函数实现其接口,高层的代码通过接口调用低层的函数。这样的如果更换低层函数,只需要让新的低层函数实现其接口,而对于高层的代码改的很少。大大降低了

因为低层函数修改而给高层带来的影响。

而为什么实现接口就不怕更改了那?这个就要涉及到另一个设计模式原则——里氏代换原则了。

里氏代换原则

派生类(子类)对象可以在程式中代替其基类(超类)对象。

一个软件实体如果使用了父类的话,其一定可以适应其子类,它察觉不出父类与子类的差别。

也就是说,在软件里面,把父类都替换成子类,其行为没有发生变化。

实际应用:

正式因为有了里氏代换原则,使继承复用成为了可能。

只有当子类替换父类,软件单元不受影响的情况下,父类才能得到复用。而子类可以在父类的基础上增加新的行为。

eg:

猫是动物,动物拥有吃喝跑叫等行为。如果,我们需要狗,牛等动物拥有这些行为。让狗,牛等继承与动物。只需要更改创建的实例就好了。

UML:(大话设计模式)

总结:

1,需求的变化只需要改变其实例化的对象。

2,有了里氏代换原则才使开放封闭原则成为可能。

(正是由于子类可以替换父类,才使父类再不修改的情况下就可以扩展)

设计模式原则——依赖倒转&里氏代换原则的更多相关文章

  1. 《设计模式》-原则二:里氏代换原则(LSP)

    回顾一下上一节说的“开闭原则” 说的是 一个软件要遵循对修改关闭 对新功能扩展的原则. 这一次来说说 “里氏代换原则” 意思是说:子类型必须能代替他们的基类. 看了半天的例子 好像 是懂非懂啊...相 ...

  2. 3里氏代换原则LSP

    一.什么是里氏代换原则 里氏代换原则(Liskov Substitution Principle): 一个软件实体如果使用的是一个父类的话,那 么一定适用于其子类,而且它察觉不出父类和子 类对象的区别 ...

  3. 设计模式之依赖倒转原则(DIP)

    1.概念 DIP:Dependency Inversion Principle 抽象不应当依赖于细节,细节应当依赖于抽象(说通俗点也就是要针对接口编程,不要针对实现编程:或者要依赖于抽象,不要依赖于具 ...

  4. 设计模式之里氏代换原则(LSP)

    里氏代换原则(Liskov Substitution Principle, LSP) 1 什么是里氏代换原则 里氏代换原则是由麻省理工学院(MIT)计算机科学实验室的Liskov女士,在1987年的O ...

  5. 里氏代换原则(Liskov Substitution Principle,LSP)

    第一种定义: 如果对每一个类型为S的对象o1,都有类型为T的对象o2,使得以T定义的所有程序P在所有的对象o1都代换为o2,程序P的行为没有发生变化,那么类型S是类型T的子类型. 第二种定义: 所有引 ...

  6. 设计模式课程 设计模式精讲 3-10 里氏替换原则coding

    1 代码演练 1.1 继承关系判别(是否是真正意义的继承) 1.2 入参控制 1.3 出参控制 1 代码演练 1.1 继承关系判别(是否是真正意义的继承)(其实我觉得这个例子有点牵强) 1.1.1 反 ...

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

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

  8. 面象对象设计原则之三:里氏替换原则(The Liskov Substitution Principle,LSP)

    里氏代换原则由2008年图灵奖得主.美国第一位计算机科学女博士Barbara Liskov教授和卡内基·梅隆大学Jeannette Wing教授于1994年提出.其严格表述如下:如果对每一个类型为S的 ...

  9. JAVA设计模式之依赖倒转原则

    3.1 依赖倒置原则的定义 依赖倒置原则(Dependence Inversion Principle,简称DIP)这个名字看着有点别扭,“依赖”还“倒置”,这到底是什么意思?依赖倒置原则的原始定义是 ...

随机推荐

  1. web前端(6)—— 标签的属性,分类,嵌套

    属性 HTML标签可以设置属性,属性一般以键值对的方式写在开始标签中 1.HTML标签除一些特定属性外可以设置自定义属性,一个标签可以设置多个属性用空格分隔,多个属性不区分先后顺序. 2.属性值要用引 ...

  2. c/c++ 标准库 pair 介绍

    标准库 pair 介绍 问题:map里的元素由key和value组成,这个key和value的组合是什么类型呢??? 答案:pair类型 pair介绍: 它是模板 有2个公有成员可供访问. first ...

  3. jenkins 备份配置信息

    本文介绍几种备份jenkin配置信息的方法,大家可根据实际情况做出选择. 我的测试环境如下: windows 7 jenkins 2.32.3 ____升级到___2.46.3 (长期支持版本) 多种 ...

  4. fedora 29 桌面版 设置 cockpit 自动开机启动

    systemctl enable cockpit 时,会出现如下错误: The unit files have no installation config (WantedBy, RequiredBy ...

  5. {windows故障}关于WIN7故障模块StackHash_0a9e解决方法

    问题背景:我给同事重装好系统后,想用驱动精灵(网卡版)给新系统安装驱动,但是在安装驱动精灵的过程中老是出现标题的问题,windows停止工作,导致无法安装,最后看到这两个方法后,把网络适配器禁用,然后 ...

  6. GMM算法的matlab程序(初步)

    GMM算法的matlab程序 在https://www.cnblogs.com/kailugaji/p/9648508.html文章中已经介绍了GMM算法,现在用matlab程序实现它. 作者:凯鲁嘎 ...

  7. spring简述

    1. 什么是Spring Spring:SE/EE开发的一站式框架.(有EE开发每一层的解决方案) WEB层:SpringMVC Service层:Spring的Bean管理,Spring的声明式事务 ...

  8. 译文——The habits of highly successful people

    1.Morning Routine (早上列行公事) Probably the most common habit ultra-successful people have is they can t ...

  9. Django admin注册model究竟要怎么写才优雅

    比如在Django admin 注册models时,会用到. 对于APP里自带的models,可以使用这种方式注册. from django.contrib import admin # Regist ...

  10. python 协程、I/O模型

    一.引子 (超哥协程) 并发本质:保存状态+切换 cpu正在运行一个任务,转而执行另一个任务的情概况:1.是该任务发生了阻塞:2.该任务计算的时间过长或有一个优先级更高的程序替代了它. 协程本质上就是 ...