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

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

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

依赖倒转原则

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

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

面向对象编程领域中,依赖反转原则(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. Nginx使用教程(七):使用Nginx缓存之proxy cache

    定义缓存目录 <br\>使用您喜欢的文本编辑器打开/etc/nginx/nginx.conf,并在http {区域加入: proxy_cache_path  /var/www/cache ...

  2. 前端性能优化成神之路-HTTP压缩开启gzip

    什么是HTTP压缩 HTTP压缩是指: Web服务器和浏览器之间压缩传输的”文本内容“的方法. HTTP采用通用的压缩算法,比如gzip来压缩HTML,Javascript, CSS文件. 能大大减少 ...

  3. MySQL高级知识(十)——批量插入数据脚本

    前言:使用脚本进行大数据量的批量插入,对特定情况下测试数据集的建立非常有用. 0.准备 #1.创建tb_dept_bigdata(部门表). create table tb_dept_bigdata( ...

  4. c# base64编码解码

    1.base64转pdf

  5. UVA12563-Jin Ge Jin Qu hao(动态规划基础)

    Problem UVA12563-Jin Ge Jin Qu hao Accept: 642  Submit: 7638Time Limit: 3000 mSec Problem Descriptio ...

  6. Python:Day42 Position

    1 static static 默认值,无定位,不能当作绝对定位的参照物,并且设置标签对象的left.top等值是不起作用的的. 2  position: relative/absolute      ...

  7. ubantu下装Docker

    Docker 要求 Ubuntu 系统的内核版本高于 3.10 ,查看本页面的前提条件来验证你的 Ubuntu 版本是否支持 Docker. 通过 uname -r 命令查看你当前的内核版本 unam ...

  8. day 06 元组、字典、集合的定义及其方法

    一:元组 1.定义:在()内用多个逗号分隔开多个任意类型的元素 元组用来记录多个值,当值没有改变的需求时,用元组更合适. 元组是有序的.不可变的(虽然数据不可变,但是数据的数据是可以改变的) t = ...

  9. RS-485总线通信协议

    https://blog.csdn.net/ouyangxin95/article/details/78174145 RS-485总线技术只是规定了接口的电气标准,并没有规定RS-485接口的电缆,插 ...

  10. ElasticSearch(站内搜索) 转发 https://www.cnblogs.com/xibei666/p/5929970.html

    简介 Elasticsearch是一个实时的分布式搜索和分析引擎.它可以帮助你用前所未有的速度去处理大规模数据.它可以用于全文搜索,结构化搜索以及分析,当然你也可以将这三者进行组合.Elasticse ...