所谓依赖倒置原则(Dependence Inversion Principle )就是要依赖于抽象,不要依赖于具体。简单的说就是对抽象进行编程,不要对实现进行编程,这样就降低了客户与实现模块间的耦合。

面向过程的开发,上层调用下层,上层依赖于下层,当下层剧烈变化时,上层也要跟着变化,这就会导致模块的复用性降低而且大大提高了开发的成本。 面向对象的开发很好的解决了这个问题,一般的情况下抽象的变化概率很小,让用户程序依赖于抽象,实现的细节也依赖于抽象。即使实现细节不断变化,只要抽象不变,客户程序就不需要变化。这大大降低了客户程序域实现细节的耦合度。

抽象不应该依赖细节,细节应该依赖于抽象。说白了,就是针对接口编程,不要针对实现编程。

依赖倒置原则包含三层含义:

1)高层模块不应该依赖低层模块,两者都应该依赖其抽象;

2)抽象不应该依赖细节;

3)细节应该依赖抽象。

依赖倒置有三种方式来实现

1、通过构造函数传递依赖对象; 比如在构造函数中的需要传递的参数是抽象类或接口的方式实现。

2、通过setter方法传递依赖对象; 即在我们设置的setXXX方法中的参数为抽象类或接口,来实现传递依赖对象。

3、接口声明实现依赖对象,也叫接口注入;

即在函数声明中参数为抽象类或接口,来实现传递依赖对象,从而达到直接使用依赖对象的目的。

为方便理解,举一些生活中的例子:

1、AGP插槽。主板和显卡之间关系的抽象。主板和显卡通常是使用AGP插槽来连接的,这样,只要接口适配,不管是主板还是显卡更换,都不是问题。

2、驾照。司机和汽车之间关系的抽象。有驾照的司机可以驾驶各种汽车。

3、电源插座。 设计模式中最能体现DIP原则的是抽象工厂模式。在抽象工厂模式中,工厂和产品都可以是抽象的,如果客户要使用的话,只要关注于工厂和产品的接口即可,不必关注与工厂和产品的具体实现。

DIP对于并行开发的影响:两个类之间有依赖关系,只要制定出他们之间的接口,就可以并行开发了。

备注: 1、什么叫做高层模块依赖于底层模块?

面向过程的开发时,为了复用一些常用代码,通常会把这些代码写成函数库的形式。这样,以后做新项目时,调用这些底层函数就可以了。这就叫做高层模块依赖于底层模块。 高层模块一般和业务逻辑相关,底层模块一般和具体实现相关。

2、何谓“倒置”?

这是因为传统的软件开发方法,如结构化的分析和设计,倾向于创建高层模块依赖于低层模块、抽象依赖于具体的软件结构。实际上,这些方法的目标之一就是去定义描述上层模块如何调用低层模块的层次结构。所以,相对于传统的过程化的方法通常所产生的那种依赖结构,一个设计良好的面向对象的程序中的依赖结构就是“被倒置”的。 来看一下那些依赖于低层模块的高层模块的含义。一个应用中的重要策略决定及业务模型正是在这些高层的模块中。也正是这些模型包含着应用的特性。但是,当这些模块依赖于低层模块时,低层模块的修改将会直接影响到它们,迫使它们也去改变。这种境况是荒谬的。应该是处于高层的模块去迫使那些低层的模块发生改变。应该是处于高层的模块优先于低层的模块。无论如何高层的模块也不应依赖于低层的模块。而且,我们想能够复用的是高层的模块。通过子程序库的形式,我们已经可以很好地复用低层的模块了。

当高层的模块依赖于低层的模块时,这些高层模块就很难在不同的环境中复用。但是,当那些高层模块独立于低层模块时,它们就能很简单地被复用了。这正是位于框架设计的最核心之处的原则。

转载于:https://www.cnblogs.com/oumyye/p/4388454.html

设计模式原则之依赖倒置原则相关推荐

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

    设计模式六大原则--里氏替换原则.依赖倒置原则详解 1.里氏代换原则(Liskov Substitution Principle) 概念 顾名思义,该原则用于经常发生替换的地方,在Java中指的是实现 ...

  2. 依赖倒置原则——举例说明Java设计模式中的依赖倒置原则

    依赖倒置原则--举例说明Java设计模式中的依赖倒置原则 一.前言 看官方定义 二.举例说明 2.1 例子介绍(无聊的可看看,着急的请跳过) 2.2 反例 2.1.1 反例1 (1)类图说明 (2)代 ...

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

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

  4. Java设计模式6,依赖倒置原则

    目录 一.依赖倒置原则定义 二.违背原则方案 1.项目经理 2.获取平均项目进度 3.获取最慢项目进度 三.依赖倒置原则改善代码 1.获取项目进度接口 2.获取平均项目进度实现类 3.获取最慢项目进度 ...

  5. 软件设计原则之里氏替换原则、依赖倒置原则

    系列文章目录 软件设计原则之单一职责原则.开闭原则 软件设计原则之里氏替换原则.依赖倒置原则 软件设计原则之接口隔离原则.合成复用原则.迪米特原则 文章目录 系列文章目录 一.里氏替换原则 什么是里氏 ...

  6. 3.六大原则例子-- 依赖倒置原则(DIP)例子

    设计模式六大原则例子-- 依赖倒置原则(DIP)例子 之前我们对设计模式的六大原则做了简单归纳,这篇博客是对依赖倒置原则进行的举例说明. 依赖倒置原则的意义 DIP是6大原则中最难以实现的原则,它是实 ...

  7. 7.12 其他面向对象设计原则3: 依赖倒置原则DIP

    其他面向对象设计原则3: 依赖倒置原则DIP  The Dependency Inversion Principle 7.1 依赖倒置原则DIP The Dependency Inversion P ...

  8. 设计原则 单一职责原则、开放封闭原则、依赖倒置原则、里氏代换原则、迪米特法则

    目录 1 单一职责原则 2 开放封闭原则 3 依赖倒置原则 4 里氏代换原则 5 迪米特法则 1 单一职责原则 比如:电脑内存坏了就应该更换内存,不应该更换CPU (内存负责内存.CPU负责CPU) ...

  9. 面向对象设计原则-03依赖倒置原则

    面向对象设计原则-03依赖倒置原则 依赖倒置原则的定义 依赖倒置原则(Dependence Inversion Principle,DIP)是 Object Mentor 公司总裁罗伯特·马丁(Rob ...

最新文章

  1. VS生成dll和lib库文件
  2. Asp.net 后台添加CSS、JS、Meta标签
  3. post install error,please remove node_moules before retry
  4. 鸿合怎么删掉linux6_鸿合电子白板怎么校准?鸿合电子白板校准的方法
  5. [C++][IO]读写二进制文件
  6. PopupWindow在项目中的使用 并指定位置及加入动画效果
  7. win10 安装tensorflow-gpu
  8. 清华姚班、斯坦福博士、普林斯顿NLP组创始人 陈丹琦 获小诺奖之称的斯隆奖!...
  9. flightgear_使用FlightGear进入虚拟天空
  10. 手把手教你用SPSS做出二元logistic回归分析
  11. 如何将多张图片合成一个pdf?
  12. 植物大战僵尸辅助之重叠植物
  13. 测试基础-测试的定义及原则?
  14. python聚类系数_NetworkX 计算聚类系数的Python实现
  15. 图解汽车各部位的名称大全
  16. O(nlogn) 求LIS(Longest Increasing Subsequence)方法的总结
  17. 一个大四实习生从安卓小白到可以独自承担安卓和web前端的一年奋斗之旅
  18. 安卓车机能升级鸿蒙吗,华为鸿蒙系统能否应用到车机系统
  19. Michael和Sophia的英语之路
  20. vue中,获取一个div的高赋值给另一个div (自适应)

热门文章

  1. vc6.0出现无法解析错误
  2. python format函数实例_Python字符串格式化,format格式化函数详细使用
  3. Mybatis工作流程及其原理与解析
  4. 025_JavaScript数组方法
  5. python单行箭头_python – 如何在matplotlib的曲线末端放置一个箭头?
  6. 搜索不包含关键词_新手教程!百度关键词规划师功能详解
  7. aspose.words 表格内容水平居中_CSS十五种方法教你如何居中一个元素
  8. php返回图片给安卓_android上传图片到PHP的过程详解
  9. eclipse远程连接hadoop_Hadoop之HDFS基本操作实验
  10. nginx安装包_安装nginx与fastdfs-nginx-module