开闭原则 依赖倒置原则_坚实原则:依赖倒置原则

开闭原则 依赖倒置原则

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

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

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

后端开发人员

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

还有一个FrontEnd开发人员

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/333598.shtml

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

相关文章

java的传值调用什么_Java的传值调用

(本文非引战或diss&#xff0c;只是说出自己的理解&#xff0c;欢迎摆正心态观看或探讨)引子之所以写这篇文章是因为前些天写了一篇《Java中真的只有值传递么&#xff1f;》探讨了网上关于Java只有值传递的说法&#xff0c;当时写这篇文章的缘由是因为之前看的文章讲解的Java只…

Linux 命令之 apt -- Debian Linux 新一代的软件包管理工具

文章目录 一、命令介绍二、常用命令三、常用选项四、命令示例(一)安装、更新和删除软件包安装指定的软件包安装软件包的同时修复依赖问题安装指定版本的软件包安装本地的 deb 包文件删除软件包,保留配置文件删除软件包,不保留配置文件将已经安装的但是不再使用的软件包删除…

liskov替换原则_坚实原则:Liskov替代原则

liskov替换原则以前&#xff0c;我们深入研究了坚实的原则&#xff0c;包括单一责任和开放/封闭原则。 Liskov替代原则&#xff08;LSP&#xff09;是子类型关系的一种特殊定义&#xff0c;称为&#xff08;强&#xff09;行为子类型&#xff0c; 假设对象S是对象T的子类型&a…

java 聚合_Java聚合

聚合如果一个类有一个类的实体引用(类中的类)&#xff0c;则它称为聚合。 聚合表示HAS-A关系。考虑有一种情况&#xff0c;Employee对象包含许多信息&#xff0c;例如&#xff1a;id&#xff0c;name&#xff0c;emailId等。它包含另一个类对象&#xff1a;address&#xff0c;…

Linux 命令之 dpkg --Debian 的一个底层包管理工具

文章目录 一、命令介绍二、deb 软件包命名规则三、软件包管理相关文件/目录四、dpkg 数据库五、子命令六、常用选项(一)安装、升级和删除软件包(二)查询和检验软件包(三)其它七、命令示例(一)安装、升级和卸载软件包安装指定的软件包解开软件包到系统目录但不配置配置软…

java jep_Java 10 – JEP 286:局部变量类型推断

java jepJava 10即将发布&#xff0c;RC Build可在此处获得 。 可在此处找到此发行版的目标功能。 在针对Java 10的所有JEP中&#xff0c;开发人员社区中最有趣且最受关注的是286&#xff1a;Local-Variable Type Inference 。 什么是局部变量类型推断&#xff1f; 我们在Java…

java ffmpeg 视频水印_java 实现视频转换通用工具类:视频加水印-Ffmpeg(五-1)

java 实现视频转换通用工具类&#xff1a;视频相互转换-Ffmpeg(三)说明&#xff1a;视频加水印支持右上角、左上角、左下角、右下角、底部居中几个方位1.根据水印文字---添加视频水印/*** 根据水印文字---添加视频水印* param srcPath 原视频路径* param tarVideoPath 生成后的…

手动 clone 安装 Homebrew

文章目录 手动 clone 安装 HomebrewHomebrew 换源替换 homebrew 源替换 homebrew-core 源替换 homebrew-bottles 源bash用户zsh 用户更新 Homebrew手动 clone 安装 Homebrew 首先进入 homebrew 目录:cd "$(brew --repo)/Library/Taps/homebrew/"创建目录 homebrew-c…

lambda 匿名内部类_Lambda运行时内部:窥视无服务器巢穴

lambda 匿名内部类有没有想过lambda里面是什么样的&#xff1f; 不要怀疑了 让我们找出答案。 自从2014年问世以来&#xff0c;AWS的lambda函数就成为一个热门话题&#xff0c;在无服务器计算领域开辟了全新的历史。 无状态&#xff0c;零维护&#xff0c;按次执行的好东西实际…

java VM argument_java之program arguments与VM arguments

program arguments 中的值作为 args[] 的参数传入的&#xff0c;而 VM Arguments 是设置的虚拟机的属性。program arguments 是要传给你的应用程序的&#xff0c;它通过主函数中的 args 来传值。 VM arguments是系统的属性&#xff0c;要传给 java 虚拟机的。如图&#xff1a;是…

java iterator 嵌套_Java中的集合嵌套

import java.util.HashMap;import java.util.Iterator;import java.util.Map;import java.util.Set;public classDemo06 {public static voidmain(String[] args) {//大 MapHashMap> oraclenew HashMap>();//小MapHashMap java1018 new HashMap();HashMap java1227 new H…

Linux/Unix 如何查看 man 搜索到的手册页(manual page)的位置及复制手册页的内容

文章目录命令 man 是如何搜索手册页的&#xff1f;如何查看手册页所在的路径通过管道输出给 vim命令 man 是如何搜索手册页的&#xff1f; man uses a sophisticated method of finding manual page files, based on the invocation options and environment variables, the …

xml不利于调试_流利的接口不利于维护

xml不利于调试流畅的界面 &#xff08;最初由Martin Fowler 创造&#xff09;是一种与OOP中的对象进行通信的非常便捷的方式。 它使他们的外墙更易于使用和理解。 但是&#xff0c;它破坏了它们的内部设计&#xff0c;使它们更难以维护。 Marco Pivetta在他的博客文章Fluent In…

java输入月份求天数_java输入年份,月份,输出当月天数

package 第二次作业; public class 第二题 { //java文件名 public static void main(String[] args) { //相当于创建主函数 String 年份 = javax.swing.JOptionPane.showInputDialog("输入一个年份:"); //求出输…

java 换行 运算符格式_Java代码样式运算符换行格式

java 换行 运算符格式上周&#xff0c;我发现了什么决定了我在较长时间里一直在努力解决的问题的决定&#xff1a;是否放置&& &#xff0c; ||之类的运算符 或在同一行或下一行。 在构造布尔表达式或隐含字符串时&#xff0c;我们可能需要中断长行。 根据《 Google Ja…

pipeline java_架构模式:pipeline

知名的 Pipeline 模式unix 的 pipelinecat helloworld.txt | grep "hello world" | rev | > output.txt读取文本内容&#xff0c;并过滤 “hello world”&#xff0c;然后反转字符&#xff0c;将最终结果输出到 output.txtWeb 框架中间件Laravel 中的管道Laravel …

MacOS 系统使用命令安装软件包

文章目录 使用 Homebrew 安装软件包先安装 Homebrew使用命令 brew 安装软件包使用命令 installer 安装 pkg 软件包使用命令安装 dmg 格式的软件包包含普通的应用程序文件的 dmg 文件如何使用命令完成安装呢?包含 pkg 安装程序的 dmg 文件又该如何通过命令完成安装呢?Linux 操…

身份证验证 校验码_用户身份验证最佳做法清单

身份证验证 校验码用户身份验证是每个Web应用程序共享的功能。 我们已经实施了很多次了&#xff0c;所以早就应该完善它了。 然而&#xff0c;错误无时无刻不在。 造成这种情况的部分原因是&#xff0c;可能出错的事情列表很长。 您可能会错误地存储密码&#xff0c;可能会具有…

mysql查询不确定的信息_mysql 07.18

1.索引搜索引导&#xff0c;索引是一个特殊的数据结构&#xff0c;期存储的是数据的关键信息与详细详细的位置对应关系。目的&#xff1a;加速查询。索引的影响&#xff1a;不是说拥有索引就能加速&#xff0c;得看你的查询语句有没有正确使用索引&#xff0c;索引也需要占用额…

MacOS 常用命令汇总

文章目录设置环境变量列出所有可以更新的软件包直接更新所有可以更新的软件包打包压缩文件忽略 Mac OS 文件系统中的扩展属性忽略 Mac OS 专有的隐藏文件创建 DMG 格式的文件修改 DMG 文件的大小修改 DMG 格式中的加密口令挂载 DMG 格式的文件推出 DMG 文件将 ISO 格式的文件转…