设计模式之依赖倒置设计原则
周末在看《深入理解Java虚拟机》,其中有关于Java虚拟机部分的描述,忽然来了灵感,感觉可以从这个角度来阐述 依赖倒置 设计原则。
最初接触 依赖倒置,是在《HeadFirst设计模式》这本书中,此后,每当业务重构或者开始一个新项目,我都会先翻一翻这本书,常读常新,每次也都会有新的体悟。
一、破题 - Java虚拟机规范和语言规范
Java
在刚刚诞生之时曾经提出过一个非常著名的宣传口号:“一次编写,到处运行”。“与平台无关” 的理想最终实现在操作系统的应用层上:Sun公司以及其他虚拟机提供商发布了许多可以运行在各种不同平台上的虚拟机,这些虚拟机都可以载入和执行同一种平台无关的字节码,从而实现了程序的 “一次编写,到处运行”。各种不同平台的虚拟机与所有操作系统平台都使用同一程序存储格式–字节码(ByteCode),这也是平台无关性的基石。
有了Java语言,程序员就可以忽略具体操作系统平台(Win、Mac、Linux等)、忽略特定硬件底层指令集(x86、ARM等),只需要关注Java语言规范,就可以“一次编写,到处运行”。
二、编程思维的依赖倒置
2.1、在 Java 语言出来之前:
程序员需要依赖特定操作系统来完成具体的工作。例如:绘制一个圆,需要调用不同操作系统的GUI绘制库来完成,库的名称以及API接口是不同的,都需要在代码中具体适配。
从依赖关系来看,高层 的应用程序,依赖 低层 的操作系统绘制库。
每当新增一个运行平台,就是在新增依赖一个绘制库。另外,后续该绘制库API改变了或者有了调整,高层的应用程序也需要跟着调整。
2.2、在 Java 语言出来之后:
程序员只需依赖 Java语言规范 即可完成具体的工作,不需要关心平台。例如:绘制一个圆,调用 Java GUI 库的API,Java 虚拟机会与特定的操作系统平台对接,绘制一个圆。
再去看依赖关系,高层 的应用程序,依赖 Java虚拟机或者语言规范,低层组件也依赖Java虚拟机或者语言规范完成功能对接。
每当新增一个运行平台,只要该平台支持 Java虚拟机或者语言规范 ,就什么都没有发生改变,后续该平台绘制库API改变了或者有了调整,高层的应用程序亦不需要跟着调整。
在Java语言出现的前后,程序编写的思维方式也跟着发生了改变。从 高层组件 依赖 低层组件,到 高层组件 和 低层组件 都依赖于 抽象,这里的 抽象 就是 Java虚拟机或者语言规范,或者说 Java 虚拟机 。
三、这和我们的依赖倒置设计原则有什么关系呢?
其实,上面的开发思维就是“依赖倒置”设计原则,依赖倒置设计原则有如下几种不同的说法:
- 要依赖抽象,不要依赖具体类
- 针对接口编程,不针对实现编程。
- 不能让高层组件依赖低层组件,两者都应该依赖于抽象。
刚刚接触这个设计模式时,最困惑的莫过于:依赖倒置原则,究竟倒置在哪里?
依赖倒置设计原则中的“倒置”指的是和一般的面向对象的思考方法完全相反。正常思维,先从顶端设计开始,然后往下到具体的低层类设计。依赖倒置设计原则要求我们先别从顶层开始,而是先看看能“抽象化”些什么。
总结
实际的案例中,完美应用依赖倒置设计原则非常难,尤其是新业务的工程架构设计,往往业务稳定铺开一段时间之后,抽象模型才会慢慢变得“清晰”。
更普遍的场景往往是,新需求无法在旧业务架构实现中迭代,不得不做架构设计调整(架构调整的第一目标就是调整前后,业务效果要一模一样,对用户来讲要像什么都没发生过一样。由于不产生新的增量,不到万不得已,不会做架构调整的)。
踩过坑,才会体会依赖倒置的强大,不说了,说多了都是眼泪。
参考资料
Head First 设计模式(中文版)-- [美] 弗里曼(Freeman,E)
大话设计模式 - 程杰著
设计模式之依赖倒置设计原则相关推荐
- 胖虎白话学习设计模式之依赖倒置原则(Dependence Inversion Principle)
胖虎白话学习设计模式之依赖倒置原则(Dependence Inversion Principle) 记录胖虎学习设计模式过程,不许勿喷,转载请注明出处! (此博文为胖虎在PDF上截取.觉得写得通俗易懂 ...
- java 依赖倒置_设计模式之三依赖倒置原则(DIP)
依赖倒置(Dependence Inversion Principle,DIP) High level modules should not deppend oupon low level modul ...
- Java 设计模式总结及六大设计原则
设计模式总结 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式. ...
- java设计模式总结之六大设计原则(有图有例子)
转载:https://www.cnblogs.com/jpfss/p/9765239.html 下面来总结下自己所学习的设计模式,首先我们看下各个模式之间的关系图,下面这张图是网上比较典型的一个类图关 ...
- 引用防删——JAVA设计模式总结之六大设计原则
JAVA设计模式总结之六大设计原则 从今年的七月份开始学习设计模式到9月底,设计模式全部学完了,在学习期间,总共过了两篇:第一篇看完设计模式后,感觉只是脑子里面有印象但无法言语.于是决定在看一篇,到9 ...
- Java设计模式总结——6大设计原则
从今年的七月份开始学习设计模式到9月底,设计模式全部学完了,在学习期间,总共过了两篇:第一篇看完设计模式后,感觉只是脑子里面有印象但无法言语.于是决定在看一篇,到9月份第二篇设计模式总于看完了,这一篇 ...
- JAVA设计模式总结之六大设计原则(一)
从今年的七月份开始学习设计模式到9月底,设计模式全部学完了,在学习期间,总共过了两篇:第一篇看完设计模式后,感觉只是脑子里面有印象但无法言语.于是决定在看一篇,到9月份第二篇设计模式总于看完了,这一篇 ...
- 设计模式系列,六大设计原则
设计模式和性能优化有没有关系?最近,我看到有人再讲性能优化的时候,讲到了"有些设计模式可以做到一定程度的性能优化". 我读书少,别骗我.我看过无数篇设计模式了,第一次听到有人说,设 ...
- 举例说明层次分析的三大原则_设计模式系列,六大设计原则
设计模式和性能优化有没有关系?最近,我看到有人再讲性能优化的时候,讲到了"有些设计模式可以做到一定程度的性能优化". 我读书少,别骗我.我看过无数篇设计模式了,第一次听到有人说,设 ...
最新文章
- Byte Cup 2018国际机器学习竞赛夺冠记
- 用互联网思维做产品的7个要…
- 爬虫必须得会的Web知识
- 异步日志系统设计demo
- MySQL5.7 安装(Redhat)
- 沃尔沃主动召回40万台车,只因一个罕见的问题
- windows hosts 作用以及常见问题解决
- Linux命令行下载文件百度云盘
- luajit官方性能优化指南和注解
- javaweb项目遇到错误
- pic12f1823单片机入门_PIC单片机入门教程V1.1
- Labview 气体/温度检测系统
- linux系统中怎么配置路由,Linux系统中路由配置介绍
- igs时间和utc_世界协调时间(UTC)与中国标准时间
- ltm是什么门的缩写_ltm的含义,ltm是什么的缩写,ltm的词语,ltm代表的意思
- 【区块链108将】千方基金点付大头:投资区块链,不要让过往认知限制你的想象...
- 在类xx中找不到 main 方法, 请将 main 方法定义为: public static void main(String[] args)否则 JavaFX 应用程序类必须....
- 解决ActiveMQ服务停掉后无限重连问题
- ubuntu 安装opendr失败_安装软件失败求助
- VB和VBS、VBA的区别及作用
热门文章
- 计算机毕业设计springboot交通违章管理系统的设计与实现s7830源码+系统+程序+lw文档+部署
- 基于php的地铁查询系统,基于php的苏州实时公交/地铁接口调用代码实例
- 原生js实现文本复制功能
- 掌上微博android源代码,掌上微博 全能手机
- CSS绘制平行四边形
- 编辑为什么建议转投_SCI编辑建议转投容易录用吗
- SOI技术及产业发展研究
- 你与阿米巴经营之间只差了一个“中国式” 胡八一
- linux shell 读取文件的三种方式
- dubbo-go 白话文 | go 和 java 互通有无