依赖倒转原则 (Dependence Inversion Principle)

定义:程序要依赖于抽象接口,不要依赖于具体实现。简单的说就是要求对抽象进行编程,不要对实现进行编程,这样就降低了客户与实现模块间的耦合。
  • 问题:类A直接依赖类B,假如要将类A改为依赖类C,则必须通过修改类A的代码来达成。这种场景下,类A一般是高层模块,负责复杂的业务逻辑;类B和类C是低层模块,负责基本的原子操作;假如修改类A,会给程序带来不必要的风险

  • 解决方案:将类A修改为依赖接口I,类B和类C各自实现接口I,类A通过接口I间接与类B或者类C发生联系,则会大大降低修改类A的几率。

  • 例子:CourseInfo 类调用 English 类和 Chinese 类 获取学科信息,今后如果增加其它学科,就需要修改 CourseInfo 类,这样违反类DIP,高层策略没有和低层实现分离,抽象没有和具体细节分离,没有这种分离,高层策略就自动地依赖于低层策略,抽象就自动地依赖于具体细节。

/*** 英语课程*/
public class English {public static final String NAME = "英语";public void getClassTimeRange() {System.out.println("早上:8:00 - 10:00");}public void getContent() {System.out.println("学习英语语法");}
}
/*** 语文课程*/
public class Chinese {public static final String NAME = "语文";public void getClassTimeRange() {System.out.println("早上:10:00 - 12:00");}public void getContent() {System.out.println("学习唐诗三百首");}
}
/*** 课程信息*/
public class CourseInfo {private English english = new English();private Chinese chinese = new Chinese();public void getCourseInfo(String courseName) {if (English.NAME.equals(courseName)) {english.getClassTimeRange();english.getContent();} else if (Chinese.NAME.equals(courseName)) {chinese.getClassTimeRange();chinese.getContent();}}
}
  • 正确做法: 抽象出 ICourse 接口,English 类、Chinese 类、Math 类都继承该接口,而 CourseInfo 使用了 ICourse ,不管今后增加多学学科都无需修改 CourseInfo,并对于具体的实现类我们是不管的,只要接口的行为不发生变化,增加新的用户等级后,上层服务不用做任何的修改。这样设计降低了层与层之间的耦合,能很好地适应需求的变化,大大提高了代码的可维护性。
/*** 课程接口*/
public interface ICourse {void getClassTimeRange();void getContent();
}
/*** 英语课程*/
public class English implements ICourse{@Overridepublic void getClassTimeRange() {System.out.println("早上:8:00 - 10:00");}@Overridepublic void getContent() {System.out.println("学习英语语法");}
}
/*** 语文课程*/
public class Chinese implements ICourse{@Overridepublic void getClassTimeRange() {System.out.println("早上:10:00 - 12:00");}@Overridepublic void getContent() {System.out.println("学习唐诗三百首");}
}
/*** 数学课程*/
public class Math implements ICourse{@Overridepublic void getClassTimeRange() {System.out.println("下午:02:00 - 04:00");}@Overridepublic void getContent() {System.out.println("背乘法口诀");}
}
/*** 课程信息*/
public class CourseInfo {public void getCourseInfo(ICourse iCourse) {iCourse.getClassTimeRange();iCourse.getContent();}
}
  • 总结:高层次的模块不应该依赖于低层次的模块,他们都应该依赖于抽象。抽象不应该依赖于具体,具体应该依赖于抽象。

依赖倒转原则 (Dependence Inversion Principle)相关推荐

  1. 软件设计原则(四)依赖倒置原则 -Dependence Inversion Principle

    依赖倒转原则就是要依赖于抽象,不要依赖于实现.(Abstractions should not depend upon details. Details should depend upon abst ...

  2. 面向对象编程原则(06)——依赖倒转原则

    版权声明 本文原创作者:谷哥的小弟 作者博客地址:http://blog.csdn.net/lfdfhl 参考资料 <大话设计模式> 作者:程杰 <Java设计模式> 作者:刘 ...

  3. Java设计原则——依赖倒转原则

    我们一定要给自己提出这样的任务:第一,学习,第二是学习,第三还是学习. 学习从来无捷径,循序渐进登高峰. 目录 一.基本介绍 二.应用实例 1.示例一 2.示例二 三.依赖关系传递的三种方式 1.接口 ...

  4. 【设计模式】七大原则之“依赖倒转原则”

    一 基本介绍 依赖倒转原则(Dependence Inversion Principle)是指: 高层模块不应该依赖低层模块,二者都应该依赖其抽象 抽象不应该依赖细节,细节应该依赖抽象 依赖倒转(倒置 ...

  5. 23种设计模式-依赖倒转原则

    概念: 依赖倒转原则(Dependence Inversion Principle)是指: 1) 高层模块不应该依赖低层模块,二者都应该依赖其抽象 2) 抽象不应该依赖细节,细节应该依赖抽象 3) 依 ...

  6. Java依赖于抽象不依赖于具体,依赖倒置原则(Dependecy-Inversion Principle)

    依赖倒置原则(Dependence Inversion Principle,DIP)的原始定义: 高层模块不应该依赖底层模块,两者都应该依赖其抽象: 抽象不应该依赖细节: 细节应该依赖抽象. 抽象:即 ...

  7. java 依赖倒置_JAVA设计模式之依赖倒转原则

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

  8. 【设计模式】依赖倒转原则(Dependence Inversion Principle)

    高层模块不应该依赖低层模块,两者都应该依赖其抽象:抽象不应该依赖细节,细节应该依赖抽象.简单的说就是要求对抽象进行编程,不要对实现进行编程,这样就降低了客户与实现模块间的耦合. 1 案例分析(组装电脑 ...

  9. Dependence Inversion Principle 依赖倒置原则

    Dependence Inversion Principle 依赖倒置原则 简介 定义:高层模块不应该依赖底层模块,二者都应该依赖其抽象 主要核心思想 强调抽象不应该依赖细节:细节应该依赖抽象,及针对 ...

最新文章

  1. 少侠!如何写一手好 SQL ?
  2. 6426C Lab6 部署和配置RMS
  3. 吴恩达 coursera AI 第三课总结+作业答案
  4. 试用期没过,因在公司上了1024网站...
  5. c语言全段字符的类别,言语理解规律整理d0c.doc
  6. HandlerInterceptor拦截器的使用
  7. H.264算法的优化策略
  8. android实现qq修改密码底部弹出框_易查分强大的“可修改列”功能:轻松实现填表、留言和信息核对...
  9. 程序员的自我修养笔记3 内存管理
  10. Linux 命令(31)—— find 命令
  11. java反编译的语句_Java开发网 - 请教,java反编译的问题
  12. 二叉树 java泛型_java二叉树
  13. cadence从原理图导出器件库_一种cadence中原理图替换元器件库的方法与流程
  14. bzoj2286 消耗战 虚树树形dp
  15. Unity线性空间UI的问题
  16. 反反爬技术,破解猫眼网加密数字
  17. 【路径规划】基于粒子群算法机器人避障路径规划matlab代码
  18. Word如何添加图片水印,看这里就够了!怎样在word加入图像水印
  19. 《苏菲的世界》读后感
  20. thinkphp6 短信宝/腾讯云发送手机号验证码

热门文章

  1. 中国移动手机邮箱测试将扩展至北京用户
  2. (CNS复现)CLAM——Chapter_00
  3. special effects - 蜘蛛网背景特效
  4. 一款集成度高的渗透工具:Railgun
  5. 俄罗斯方块源码分享 html+css+js
  6. 第三周的第一天,心情很down。
  7. 微信小程序【网易云音乐实战】(第五篇 转发分享、每日推荐、音乐播放、页面通信npm包、进度条、全局数据)
  8. Ubuntu16.04安装与彻底卸载docker(亲测有效)
  9. 聚苯乙烯和可膨胀聚苯乙烯的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  10. Java程序员必须要学ajax吗,Java程序员需要具备哪些专业技能?