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

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

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

依赖倒转原则

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

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

面向对象编程领域中,依赖反转原则(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. C#计算时间差 TimeSpan

    TimeSpan的相关属性 Add:与另一个TimeSpan值相加. Days:返回用天数计算的TimeSpan值. Duration:获取TimeSpan的绝对值. Hours:返回用小时计算的Ti ...

  2. 第九章 通过 SMB 共享虚拟机

      自 Windows Server 2012 起,微软引入了 SMB 3.0 的概念,通过 SMB 3.0,可以实现很多新的功能,包括我们介绍过的"SMB 多通道",以及将虚拟机 ...

  3. [转]JIRA 7.2.6与Confluence 6.0.3的安装与配置之MS SQL Server版

    相关软件版本信息 说明:下方软件可以点击链接,通过百度云盘进行下载. 操作系统:Windows 10(密码:foht)或者Windows Server 2012(密码:lsad): 数据库:SQL S ...

  4. Jmeter 登入、新增、查询、修改、删除,动态传参。

    1.设置HTTP Request Defaults    请求默认值,这样之后每次请求同一个域名端口的时候后都不用输入协议.域名.端口号. 2.输入[登入]的接口号. 3.设置HTTP header  ...

  5. php学习----异常处理(接上篇)

    PHP异常处理之抛出一个异常 从PHP5开始,PHP支持异常处理,异常处理是面向对象一个重要特性,PHP代码中的异常通过throw抛出,异常抛出之后,后面的代码将不会再被执行. 既然抛出异常会中断程序 ...

  6. linux中find命令高级用法

    前言 在<Linux中的文件查找技巧>一文中,我们已经知道了文件查找的基本方法,今天我们介绍find命令的一些高级使用技巧.它能满足我们一些更加复杂的需求. 查找空文件或空目录 有时候需要 ...

  7. 【Linux基础】Linux更改系统IP

    1.SUSE系统 (1)设置IP cd /etc/sysconfig/network/ vi ifcfg-eth0 BOOTPROTO='static'   #静态IPBROADCAST='192.1 ...

  8. ES6+Vue+webpack项目,在ie11中请求后台接口后数据更新,但是页面没有刷新?

    因为ie11下,如果GET请求请求相同的URL,默认会使用之前请求来的缓存数据,而不会去请求接口获取最新数据,我用的解决方法是在每个请求发送前,拦截请求并给请求接口的URL后加一个时间戳(new Da ...

  9. E. Magic Stones CF 思维题

    E. Magic Stones time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...

  10. 【HNOI2016】大数

    [HNOI2016]大数 题目链接 题目描述 小 B 有一个很大的数 $ S $,长度达到了 $ N $ 位:这个数可以看成是一个串,它可能有前导 $ 0 $,例如 00009312345 .小 B ...