设计模式六大原则——里氏替换原则、依赖倒置原则详解


1、里氏代换原则(Liskov Substitution Principle)

  • 概念

    顾名思义,该原则用于经常发生替换的地方,在Java中指的是实现抽象和实现父子类相互替换的原则,是面向对象设计的基本原则之一

  • 内容
    示例源代码:

Animal抽象类:

public abstract class Animal{//抽象方法public abstract void eat();
}

House子类:

public class Horse extends Animal{@Overridepublic void eat() {System.out.println("马吃草");}//因为参数与父类不同,所以也是特有方法public void eat(String food) {System.out.println("马吃" + food);}
}

Bird子类源码:

public class Horse extends Animal{//继承父类的方法public void eat() {System.out.println("鸟吃食");}//自己特有的方法public void fly() {System.out.println("鸟在飞");}
}

LSPTest测试类:

public class LSPTest {public static void main(String[] args) {//声明基类对象Animal animal;//使用基类指向子类animal = new Horse();animal.eat();//使用基类指向子类animal = new Bird();animal.eat();//Horse horse = new Animal(); 错误}
}

其包含了如下四种准则:

  1. 子类必须完全实现父类的方法
  2. 子类可以有自己特有的方法
  3. 子类的输入参数是父类输入参数的子类或者与之一致
  4. 子类的返回类型是父类返回类型的子类或与之一致
  • 总结

    继承的优点:

    1. 减少创建类的工作量,因为每个子类都具有父类的属性和方法;
    2. 提高了代码的重用性
    3. 提高了可扩展性,因为子类可以有自己独特的方法和属性。

    当然,继承也存在缺点:

    1. 继承具有入侵性,降低了代码的灵活性,因为继承后,不管愿不愿意都要拥有父类的方法和属性
    2. 增加了耦合,一旦父类发生变动,所有子类就相当于都被发生变动了

2、依赖倒置原则(Dependence Inversion Principle)

  • 概念

    传统的设计方法倾向于高层次模块依赖低层次模块,抽象层次依赖具体层次。而“倒置原则”将这个错误纠正了过来,由此命名为“依赖倒置原则”。

    其包含了三层含义:

    1. 高层次模块不应该依赖底层模块,两者都依赖其抽象类
    2. 抽象不依赖细节
    3. 细节应该依赖于抽象

    在java中的表现:

    1. 模块间的依赖通过抽象产生,实现类之间不直接发生依赖关系,其依赖关系是通过接口或者抽象类产生
    2. 接口或抽象类不依赖实现类,实现类依赖于接口或抽象类
  • 内容

    通俗的说,依赖倒置原则就是“面向接口编程”——OOD(Object - Oriented Design)的精髓之一。

    下面是图解:

不难看出,依赖倒置的本质是通过抽象(接口或抽象类)使各个类或模块的实现实现彼此独立,互不影响,实现模块间的松耦合。

  • 总结

    1. 每个类都应具有接口或抽象类,或者同事具备抽象类和接口,这是依赖倒置的前提条件,有了抽象才可以依赖倒置
    2. 任何类型都不应该从具体类派生,即应该从抽象类或接口派生
    3. 尽量不要重写基类的方法
    4. 要结合里氏替换原则(继承规范)来使用

设计模式六大原则之里氏替换原则、依赖倒置原则详解相关推荐

  1. php 倒置,PHP依赖倒置案例详解

    这次给大家带来PHP依赖倒置案例详解,PHP依赖倒置的注意事项有哪些,下面就是实战案例,一起来看一下. 什么是依赖倒置呢?简单地讲就是将依赖关系倒置为依赖接口,具体概念如下: 1.上层模块不应该依赖于 ...

  2. 设计模式初探之设计模式六大原则(3):依赖倒置原则

    定义:高层模块不应该依赖低层模块,二者都应该依赖其抽象:抽象不应该依赖细节:细节应该依赖抽象. 问题由来:类A直接依赖类B,假如要将类A改为依赖类C,则必须通过修改类A的代码来达成.这种场景下,类A一 ...

  3. java solid设计原则_六大设计原则之里氏替换原则(LSP)

    一.SOLID 设计模式的六大原则有: Single Responsibility Principle:单一职责原则 Open Closed Principle:开闭原则 Liskov Substit ...

  4. 2016-12-28 迪米特法则+依赖倒转原则+里氏替换原则

    依赖倒转原则 依赖倒转原则,也翻译成依赖倒置原则,抽象不应该依赖细节,细节应该依赖于抽象,要针对接口编程,而不是对实现编程.如电脑中无论主板.CPU.内存.硬盘都是针对接口设计的,PC电脑硬件的发展, ...

  5. 设计模式:依赖倒置原则

    依赖倒置原则定义 依赖倒置原则(Dependence Inversion Principle ,DIP)定义如下: High level modules should not depend upon ...

  6. 设计模式系列:依赖倒置原则

    问题由来   问题由来:类A直接依赖类B,假如要将类A改为依赖类C,则必须通过修改类A的代码来达成.这种场景下,类A一般是高层模块,负责复杂的业务逻辑:类B和类C是低层模块,负责基本的原子操作:假如修 ...

  7. JAVA【设计模式】依赖倒置原则

    依赖倒置原则 一.设计模式的规范 二.依赖倒置原则 三.示例 非依赖倒置原则(硬编码) 依赖倒置原则 UML关系图 一.设计模式的规范 设计模式遵循六⼤原则:单⼀职责( ⼀个类和⽅法只做⼀件事 ).⾥ ...

  8. 设计模式-依赖倒置原则

    依赖倒置原则 1 依赖倒置原则的定义 依赖倒置原则(Dependence Inversion Principle,DIP)这个名字看着有点别扭,"依赖"还"倒置" ...

  9. php 依赖倒置原则,依赖倒置原则 - LieBrother的个人空间 - OSCHINA - 中文开源技术交流社区...

    个人博客原文: 依赖倒置原则 设计模式六大原则之三:依赖倒置原则. 简介 姓名 :依赖倒置原则 英文名 :Dependence Inversion Principle 价值观 :大男子主义的典型代表, ...

  10. 深入理解依赖倒置原则(Dependence Inversion Principle)

    Dependence Inversion Principle 依赖倒置原则(Dependence Inversion Principle) What 什么是依赖倒置原则? Why 为什么使用依赖倒置原 ...

最新文章

  1. BZOJ5102:[POI2018]Prawnicy(贪心,堆)
  2. db2 日期英式写法_《学霸英语》16:美国人和英国人“表达日期”,差距竟然这么大!...
  3. u-boot之怎么实现分区
  4. html表单没有csrf保护,如何在Symfony 1.4中为表单禁用CSRF保护/验证
  5. php控制器是啥,控制器的定义
  6. 题目:16版.雇员的工作职责(一)
  7. C#学习笔记(十一):类和对象
  8. Picasso源码阅读笔记六
  9. LeetCode Closest Binary Search Tree Value II
  10. linux php 入侵,入侵linux教程 - 冷漠 ' Blog - Focus on Information Security !
  11. Mybatis之分表设计与分表插入
  12. vs如何包含库文件以及头文件
  13. 用python解方程和微积分
  14. 计算机鼠标老跳动,电脑鼠标总跳是怎么回事?
  15. python 学生编程--3 多彩同心圆
  16. 《云计算安全体系》之虚拟化安全读后总结
  17. 计算机在保险的应用,浅谈计算机信息系统在医疗保险中的应用
  18. Camera2 YUV_420_888转NV21
  19. HTML5游戏化互动学习平台,h5游戏平台_触摸型互动slg黄油手游
  20. 科普丨机器学习翻译和谷歌翻译算法

热门文章

  1. 第六章 商品详情进阶 + redis分布式锁 + redis问题解决 + redisson + 布隆过滤器
  2. 一顿操作猛如虎,老罗也要啃老土
  3. 浏览器控制bartender打印方案
  4. 解决studio 3T时间到期方法
  5. GPS北斗模块串口助手输出测试
  6. Spring Boot入门到精通(超详细)
  7. 数据库系统概论(第五版)王珊 自用复习笔记
  8. java毕业设计大学生能力建设项目管理系统Mybatis+系统+数据库+调试部署
  9. JAVA必背面试题和项目面试通关要点
  10. vue项目 添加全局水印或某个指定页面水印 源码