依赖倒转原则 (Dependence Inversion Principle)
依赖倒转原则 (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)相关推荐
- 软件设计原则(四)依赖倒置原则 -Dependence Inversion Principle
依赖倒转原则就是要依赖于抽象,不要依赖于实现.(Abstractions should not depend upon details. Details should depend upon abst ...
- 面向对象编程原则(06)——依赖倒转原则
版权声明 本文原创作者:谷哥的小弟 作者博客地址:http://blog.csdn.net/lfdfhl 参考资料 <大话设计模式> 作者:程杰 <Java设计模式> 作者:刘 ...
- Java设计原则——依赖倒转原则
我们一定要给自己提出这样的任务:第一,学习,第二是学习,第三还是学习. 学习从来无捷径,循序渐进登高峰. 目录 一.基本介绍 二.应用实例 1.示例一 2.示例二 三.依赖关系传递的三种方式 1.接口 ...
- 【设计模式】七大原则之“依赖倒转原则”
一 基本介绍 依赖倒转原则(Dependence Inversion Principle)是指: 高层模块不应该依赖低层模块,二者都应该依赖其抽象 抽象不应该依赖细节,细节应该依赖抽象 依赖倒转(倒置 ...
- 23种设计模式-依赖倒转原则
概念: 依赖倒转原则(Dependence Inversion Principle)是指: 1) 高层模块不应该依赖低层模块,二者都应该依赖其抽象 2) 抽象不应该依赖细节,细节应该依赖抽象 3) 依 ...
- Java依赖于抽象不依赖于具体,依赖倒置原则(Dependecy-Inversion Principle)
依赖倒置原则(Dependence Inversion Principle,DIP)的原始定义: 高层模块不应该依赖底层模块,两者都应该依赖其抽象: 抽象不应该依赖细节: 细节应该依赖抽象. 抽象:即 ...
- java 依赖倒置_JAVA设计模式之依赖倒转原则
3.1 依赖倒置原则的定义 依赖倒置原则(Dependence Inversion Principle,简称DIP)这个名字看着有点别扭,"依赖"还"倒置",这 ...
- 【设计模式】依赖倒转原则(Dependence Inversion Principle)
高层模块不应该依赖低层模块,两者都应该依赖其抽象:抽象不应该依赖细节,细节应该依赖抽象.简单的说就是要求对抽象进行编程,不要对实现进行编程,这样就降低了客户与实现模块间的耦合. 1 案例分析(组装电脑 ...
- Dependence Inversion Principle 依赖倒置原则
Dependence Inversion Principle 依赖倒置原则 简介 定义:高层模块不应该依赖底层模块,二者都应该依赖其抽象 主要核心思想 强调抽象不应该依赖细节:细节应该依赖抽象,及针对 ...
最新文章
- 少侠!如何写一手好 SQL ?
- 6426C Lab6 部署和配置RMS
- 吴恩达 coursera AI 第三课总结+作业答案
- 试用期没过,因在公司上了1024网站...
- c语言全段字符的类别,言语理解规律整理d0c.doc
- HandlerInterceptor拦截器的使用
- H.264算法的优化策略
- android实现qq修改密码底部弹出框_易查分强大的“可修改列”功能:轻松实现填表、留言和信息核对...
- 程序员的自我修养笔记3 内存管理
- Linux 命令(31)—— find 命令
- java反编译的语句_Java开发网 - 请教,java反编译的问题
- 二叉树 java泛型_java二叉树
- cadence从原理图导出器件库_一种cadence中原理图替换元器件库的方法与流程
- bzoj2286 消耗战 虚树树形dp
- Unity线性空间UI的问题
- 反反爬技术,破解猫眼网加密数字
- 【路径规划】基于粒子群算法机器人避障路径规划matlab代码
- Word如何添加图片水印,看这里就够了!怎样在word加入图像水印
- 《苏菲的世界》读后感
- thinkphp6 短信宝/腾讯云发送手机号验证码
热门文章
- 中国移动手机邮箱测试将扩展至北京用户
- (CNS复现)CLAM——Chapter_00
- special effects - 蜘蛛网背景特效
- 一款集成度高的渗透工具:Railgun
- 俄罗斯方块源码分享 html+css+js
- 第三周的第一天,心情很down。
- 微信小程序【网易云音乐实战】(第五篇 转发分享、每日推荐、音乐播放、页面通信npm包、进度条、全局数据)
- Ubuntu16.04安装与彻底卸载docker(亲测有效)
- 聚苯乙烯和可膨胀聚苯乙烯的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
- Java程序员必须要学ajax吗,Java程序员需要具备哪些专业技能?