坚实原则:依赖倒置原则

到目前为止,我们只研究了单一职责 , 打开/关闭 , 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/348466.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python处理中文字符串_python字符串中的中文处理

LeetCode 374&period; Guess Number Higher or LowerWe are playing the Guess Game. The game is as follows: I pick a number from 1 to n. You have to gues ...【HDU】1693 Eat the Treeshttp://acm.hdu.edu.cn/showproblem.php?pid1693 题意:nm的棋盘求简单回路(可以…

java创建类的三个步骤_3个简单步骤即可测试Java 8

java创建类的三个步骤即将发布的Java 8版本为Java开发人员带来了许多新功能&#xff0c;但是升级时始终存在代码破裂的风险。 我们都记得Java 7出厂时有一系列非常严重的错误 。 当然&#xff0c;我们所有人都可以帮助避免在Java 8中出现相同的问题。我今天要介绍的方法是使用…

mybatis嵌套查询和嵌套结果有什么区别_Java面试专题之九:Mybatis面试5个大概率被问到的问题...

1、为什么说 Mybatis 是半自动 ORM 映射工具&#xff1f;它与全自动的区别在哪里&#xff1f;Hibernate 属于全自动 ORM 映射工具&#xff0c;使用 Hibernate 查询关联对象或者关联集合对象时&#xff0c;可以根据对象关系模型直接获取&#xff0c;所以它是全自动的。而 Mybati…

使用Pargon-neo进行5G sync相关的测试

前言 Paragon-neo是Calnex旗下的一款测试仪器&#xff0c;主要用于5G的高精度场景下的PTP与SyncE的测试&#xff0c;它可以提供高达100GbE的测试速度&#xff0c;可以用在ITU-T G.8273.2 C/D类边界时钟测试&#xff0c;符合O-RAN的O-DU和O-RU设备&#xff0c;以及设计和部署5G…

功能Java示例 第1部分–从命令式到声明式

函数式编程&#xff08;FP&#xff09;的目的是避免重新分配变量&#xff0c;避免可变的数据结构&#xff0c;避免状态并全程支持函数。 如果将功能性技术应用于日常Java代码&#xff0c;我们可以从FP中学到什么&#xff1f; 在这个名为“ Functional Java by Example”的系列…

python怎样使用各个日期赤纬_python--日期操作

import datetimedatetime有几个常用类:date time datetime timedelta1. 今天日期时间(今天时间)>>> import datetime>>> now datetime.datetime.now()>>> print now2014-06-04 21:08:32.952591(今天日期)>>> print datetime…

常用的光电模块SFP、QSFP等解析

前言 学习记录 BNC 是用来接同轴电缆的接口&#xff0c;好处是降低了信号之间的相互干扰&#xff1b;主要市场是安防行业以及一些使用同轴电缆作为传输介质的令牌以太网。举个例子就是小时候的电视机后面经常能够看见这种线&#xff0c;BNC接头中间有一个凸起来的针&#xff…

python最短路径例子_Python实现的多叉树寻找最短路径算法示例

本文实例讲述了Python实现的多叉树寻找最短路径算法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;多叉树的最短路径&#xff1a;思想&#xff1a;传入start 和 end 两个 目标值1 找到从根节点到目标节点的路径2 从所在路径&#xff0c;寻找最近的公共祖先节点&#…

零分钟即可在容器开发套件(CDK)上实现云运营

尽管这很有趣&#xff0c;但实际上并不可行&#xff0c;很快就遇到了使用限制。前一段时间&#xff0c; 我逐步完成了在容器中安装称为CloudForms的云管理解决方案。 真正的解决方案是将这个示例放入Red Hat Demo Central集合中&#xff0c;并将其放在基于开放技术的Cloud解决…

NTPv4协议解析

前言 本文的撰写基于RFC5905.NTP 是时间网络控制协议&#xff0c;V4版本相交V3版本&#xff0c;修复了V3存在的一些问题。尤其是NTPV4的拓展时间戳鼓励使用浮动双数据类型&#xff0c;这样使得NTP能够更好的支持1ns的场景&#xff0c;轮询间隔也从上一代的最多1024s拓展到了36…

c++中的引用和python中的引用_【总结】C++、C#、Java、Javascript、Python中引用的区别...

首先分两大阵营&#xff1a;C中引用是一块阵营&#xff0c;C#、Java、Javascript、Python中引用是另一块阵营。之所以这样分是因为同一阵营中引用使用方法基本一样。C引用本质是个常量指针&#xff0c;而其他语言引用本质是个普通指针。也就意味着C的引用一旦初始化(指向确定了…

看完这篇还不会化简卡诺图?你来打我

最通俗易懂的的卡诺图化简教程 首先我们来介绍一下什么是卡诺图&#xff1a; 卡诺图是逻辑函数的一种图形表示。一个逻辑函数的卡诺图就是将此函数的最小项表达式中的各最小项相应地填入一个方格图内&#xff0c;此方格图称为卡诺图。 卡诺图的构造特点使卡诺图具有一个重要性…

javabean 连接mysql_连接mysql的javabean实例+简单分页

连接mysql的javabean实例简单分页rs.getString(user_id)rs.getString(user_name)rs.getString(user_mail)rs.getString(user_adds)int Cint(String cint){try {int n;n Integer.parseInt(cint);return n;}catch (NumberFormatException e) {return 0;}}%>int PageSize5; //设…

java 工厂方法模式_Java中的工厂方法模式

java 工厂方法模式在上一篇有关模板方法模式的文章中 &#xff0c;我展示了如何利用lambda表达式和默认方法 。 在本文中&#xff0c;我将探讨工厂方法模式&#xff0c;并了解如何利用方法引用&#xff0c;这是Java 8中与lambda表达式一起添加的另一项功能。 让我们考虑一个Ve…

几种常见的集成触发器(D、T、JK)

同步RS触发器存在“空翻”现象&#xff0c;即触发器存在多次翻转的现象&#xff0c;空翻破坏了“时序电路按时钟节拍工作&#xff0c;每个时钟脉冲作用下电路的状态只发生一次转换”的基本原则 解决方法&#xff1a;将电平触发改为边沿触发&#xff0c;使得触发器旨在时钟脉冲…

mysql md5版本校验_MySQL查询以名称的md5版本更新所有条目?

为此&#xff0c;您可以使用MD5()。让我们首先创建一个表-mysql> create table DemoTable1887(Password text,HashPassword text);使用插入命令在表中插入一些记录-mysql> insert into DemoTable1887(Password) values(John9089);mysql> insert into DemoTable1887(Pa…

Hashcat从入门到入土(一)

Hashcat的官方是这么介绍自己的 Hashcat is a password recovery tool. It had a proprietary code base until 2015, but was then released as open source software. Versions are available for Linux, OS X, and Windows. Examples of hashcat-supported hashing algorith…

MySQL在哪里看secret_key_K8S 创建和查看secret(九)

yaml中的用户密码敏感信息一般都会采用密码存储采用base64编码进行加密[roothz-95 pv]# echo -n guang | base64emd1YW5nag[roothz-95 pv]# echo -n 1q2w#E$R | base64cat secret.ymalapiVersion: v1kind: Secretmetadata:name: mysecret2data:username: emd1YW5nagpassword: M…

java 语义_Java文件合并变得语义化

java 语义与任何程序员交谈&#xff0c;并询问他应该如何进行合并&#xff1a;“它应该理解代码&#xff0c;对其进行解析&#xff0c;然后根据结构进行合并” –他很可能会说。 而这恰恰是SemanticMerge for Java所做的&#xff1a;它解析要合并的文件&#xff08;加上祖先或…

python循环指令_Python循环

布尔运算学习循环之前&#xff0c;先了解一个概念&#xff1a;布尔运算布尔运算是数字符号化的逻辑推演法&#xff0c;包括联合、相交、相减。在图形处理操作中引用了这种逻辑运算方法以使简单的基本图形组合产生新的形体&#xff0c;并由二维布尔运算发展到三维图形的布尔运算…