到目前为止,我们只研究了单一职责 , 打开/关闭 , liskov替换和接口隔离原则。
依赖倒置是我们要研究的最后一个原理之一。
该原则指出

答:高级模块不应依赖于低级模块。 两者都应依赖抽象。
B.抽象不应依赖细节。 细节应取决于抽象。

让我们开始一些违反该原理的代码。
作为软件团队,我们需要实施一个项目。 目前,软件团队包括:

后端开发人员

package com.gkatzioura.solid.di;public class BackEndDeveloper {public void writeJava() {}
}

还有一个前端开发人员

package com.gkatzioura.solid.di;public class FrontEndDeveloper {public void writeJavascript() {}}

我们的项目在整个开发过程中都使用。

package com.gkatzioura.solid.di;public class Project {private BackEndDeveloper backEndDeveloper = new BackEndDeveloper();private FrontEndDeveloper frontEndDeveloper = new FrontEndDeveloper();public void implement() {backEndDeveloper.writeJava();frontEndDeveloper.writeJavascript();}}

因此,我们可以看到Project类是一个高级模块,它依赖于诸如BackEndDeveloper和FrontEndDeveloper之类的低级模块。 实际上,我们违反了依赖倒置原则的第一部分。

同样通过检查Project.class的实现功能,我们认识到方法writeJava和writeJavascript是绑定到相应类的方法。 关于项目范围,这些都是细节,因为在两种情况下它们都是开发形式。 因此,违反了依赖倒置原则的第二部分。

为了解决这个问题,我们将实现一个称为Developer接口的接口。

package com.gkatzioura.solid.di;public interface Developer {void develop();
}

因此,我们引入一个抽象。

BackEndDeveloper应该重构为

package com.gkatzioura.solid.di;public class BackEndDeveloper implements Developer {@Override public void develop() {writeJava();}private void writeJava() {}}

并且将FrontEndDeveloper重构为

package com.gkatzioura.solid.di;public class FrontEndDeveloper implements Developer {@Override public void develop() {writeJavascript();}public void writeJavascript() {}}
[/sourecode]The next step in order to tackle the violation of the first part would be to refactor the Project class so that it will not depend on the FrontEndDeveloper and the BackendDeveloper class.package com.gkatzioura.solid.di;import java.util.List;public class Project {private List<Developer> developers;public Project(List<Developer> developers) {this.developers = developers;}public void implement() {developers.forEach(d->d.develop());}}

结果是Project类不依赖于较低级别的模块,而是依赖于抽象。 低层模块及其细节也取决于抽象。

您可以在github上找到源代码。

另外,我还编写了备忘单,其中包含一些扎实的原则。 在链接中注册以接收它。

翻译自: https://www.javacodegeeks.com/2018/02/solid-principles-dependency-inversion-principle.html

坚实原则:依赖倒置原则相关推荐

  1. 设计模式之禅之六大设计原则-依赖倒置原则

    依赖倒置原则 依赖倒置原则的原始定义是: ● 高层模块不应该依赖低层模块,两者都应该依赖其抽象; ● 抽象不应该依赖细节; ● 细节应该依赖抽象. 那什么是抽象?什么又是细节呢? ---->在J ...

  2. 【设计模式】软件设计七大原则 ( 依赖倒置原则 | 代码示例 )

    文章目录 一.依赖倒置原则简介 二.面向实现编程代码示例 ( 反面示例 ) 1.顾客类 2.测试类 三.依赖倒置原则代码示例 ( 推荐示例 | 使用接口方法注入 IGood 实现类 ) 1.顾客类 2 ...

  3. java设计模式之设计原则②依赖倒置原则

    定义: ⑴高层模块不应该依赖低层模块,二者都应该依赖其抽象 ⑵抽象不应该依赖细节,细节应该依赖抽象 ⑶针对接口编程,不要针对实现编程 我们通过抽象包括使用接口或者抽象类可以使各个类或模块的实现彼此独立 ...

  4. 设计模式--6大原则--依赖倒置原则

    依赖倒置原则(Dependence Inversion Principle),简称DIP 定义 High level modules should depend upon low level modu ...

  5. 软件设计的七大原则 --开闭原则 里氏替换原则 依赖倒置原则

    在软件开发中,为了提高软件系统的可维护性和可复用性,增加软件的可扩展性和灵活性,程序员要尽量根据 7 条原则来开发程序,从而提高软件开发效率.节约软件开发成本和维护成本. 这 7 种设计原则是软件设计 ...

  6. 5.里氏代换原则依赖倒置原则

    里氏代换原则(LSP):子类型必须能够替换掉它们的父类(子类可以看做父类来使用) 依赖倒置原则:高层模块不应该依赖于低层模块,两个都应该依赖抽象:抽象不应该依赖细节,细节应该依赖抽象.

  7. java与模式--里氏代换原则,依赖倒置原则

    一里氏代换原则 1.基类可以出现的地方,子类也可以出现. 2.子类可以替换基类出现的替换,软件的功能行为不改变,则基类可以复用,子类可以扩展基类的功能. 3.例子 <1>正方形继承长方形. ...

  8. 设计原则(单一职责原则 开放封闭原则 里氏替换原则 依赖倒置原则 接口隔离原则 迪米特法则)

    设计原则 单一职责原则(SRP) 从三大特性角度看原则: 应用的设计模式: 开放封闭原则(OCP) 从三大特性角度看原则: 应用的设计模式: 里氏替换原则(LSP) 从三大特性角度看原则: 应用的设计 ...

  9. Java 七大设计原则 - 依赖倒置原则/面向接口编程

    一.什么是依赖倒置原则(Dependence Inversion Principle, DIP) ?  - 面向接口编程(Object-Oriented Design, OOD) (1) 高层模块与低 ...

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

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

最新文章

  1. 学校拥有计算机清单和所放位置说明,大学计算机基础期末考试指南(2011)
  2. Linux生成随机字符串
  3. 国外的程序猿可以工作到退休而国内的为什么这么短命(思维认知)
  4. 服务器硬盘 主板,服务器主板和普通主板有什么区别?
  5. 【Go语言】【15】GO语言的面向对象
  6. SNMP简单网络管理协议
  7. linux cat grep+head/tail
  8. ABBYY15版无水印免费Pdf编辑器
  9. adb操作命令详大全利用adb命令查看apk文件包名
  10. 数学机器证明与机器验证
  11. 苹果手机各种尺寸详细表苹果X、苹果XS、苹果XR、苹果XSMax、苹果11、苹果11 Pro、苹果 11 Pro Max 、苹果12、苹果12mini、苹果 12 Pro Max、苹果12pro 尺寸
  12. VUE时间戳和时间相互转换,使用UI库为Ant Design of Vue
  13. java freemark导出word 实现word分页
  14. R语言中的I(x^2)
  15. 三星很陶醉:爷会成为智能手机之王
  16. Firefox for Mac(火狐浏览器 mac)一款速度快到飞起的浏览器
  17. 从设计的角度看 Redux
  18. 【虹科】“天问一号”着落的火星,你也想亲眼见证吗?——天体物理观测、短波红外技术与SIRIS相机
  19. 会议服务器串口协议,全时远程会议服务器
  20. max9526——PAL/NTSC解码芯片

热门文章

  1. OAuth2 实现单点登录 SSO
  2. layer之jquery 弹窗插件 (最后版本v1.8.5)
  3. 漫画:什么是鸡尾酒排序
  4. 干货 | Tomcat 连接数与线程池详解
  5. MyBatis中的注解
  6. linux软件可以在所有发行版运行吗,Linux通用的跨发行版的3大软件包管理器
  7. php 错误提示开启,php开启与关闭错误提示,php开启错误提示_PHP教程
  8. tsc244标签编辑软件_能打小票的标签机,M110智能标签打印机来了!
  9. Multi-catch parameters are not allowed for source level below 1.7 解决方法
  10. java泛型程序设计——调用遗留代码