热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

设计模式之依赖倒置设计原则

周末在看《深入理解Java虚拟机》,其中有关于Java虚拟机部分的描述,忽然来了灵感,感觉可以从这个角度来阐述依赖倒置设计原则。最初接触

周末在看《深入理解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 虚拟机

三、这和我们的依赖倒置设计原则有什么关系呢?

其实,上面的开发思维就是“依赖倒置”设计原则,依赖倒置设计原则有如下几种不同的说法:

  • 要依赖抽象,不要依赖具体类
  • 针对接口编程,不针对实现编程。
  • 不能让高层组件依赖低层组件,两者都应该依赖于抽象。

刚刚接触这个设计模式时,最困惑的莫过于:依赖倒置原则,究竟倒置在哪里?

依赖倒置设计原则中的“倒置”指的是和一般的面向对象的思考方法完全相反。正常思维,先从顶端设计开始,然后往下到具体的低层类设计。依赖倒置设计原则要求我们先别从顶层开始,而是先看看能“抽象化”些什么。

总结

实际的案例中,完美应用依赖倒置设计原则非常难,尤其是新业务的工程架构设计,往往业务稳定铺开一段时间之后,抽象模型才会慢慢变得“清晰”。

更普遍的场景往往是,新需求无法在旧业务架构实现中迭代,不得不做架构设计调整(架构调整的第一目标就是调整前后,业务效果要一模一样,对用户来讲要像什么都没发生过一样。由于不产生新的增量,不到万不得已,不会做架构调整的)。

踩过坑,才会体会依赖倒置的强大,不说了,说多了都是眼泪。

参考资料


  1. Head First 设计模式(中文版)-- [美] 弗里曼(Freeman,E)

  2. 大话设计模式 - 程杰著


推荐阅读
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • 恶意软件分析的最佳编程语言及其应用
    本文介绍了学习恶意软件分析和逆向工程领域时最适合的编程语言,并重点讨论了Python的优点。Python是一种解释型、多用途的语言,具有可读性高、可快速开发、易于学习的特点。作者分享了在本地恶意软件分析中使用Python的经验,包括快速复制恶意软件组件以更好地理解其工作。此外,作者还提到了Python的跨平台优势,使得在不同操作系统上运行代码变得更加方便。 ... [详细]
  • 本文概述了JNI的原理以及常用方法。JNI提供了一种Java字节码调用C/C++的解决方案,但引用类型不能直接在Native层使用,需要进行类型转化。多维数组(包括二维数组)都是引用类型,需要使用jobjectArray类型来存取其值。此外,由于Java支持函数重载,根据函数名无法找到对应的JNI函数,因此介绍了JNI函数签名信息的解决方案。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • 嵌入式处理器的架构与内核发展历程
    本文主要介绍了嵌入式处理器的架构与内核发展历程,包括不同架构的指令集的变化,以及内核的流水线和结构。通过对ARM架构的分析,可以更好地理解嵌入式处理器的架构与内核的关系。 ... [详细]
  • GPT-3发布,动动手指就能自动生成代码的神器来了!
    近日,OpenAI发布了最新的NLP模型GPT-3,该模型在GitHub趋势榜上名列前茅。GPT-3使用的数据集容量达到45TB,参数个数高达1750亿,训练好的模型需要700G的硬盘空间来存储。一位开发者根据GPT-3模型上线了一个名为debuid的网站,用户只需用英语描述需求,前端代码就能自动生成。这个神奇的功能让许多程序员感到惊讶。去年,OpenAI在与世界冠军OG战队的表演赛中展示了他们的强化学习模型,在限定条件下以2:0完胜人类冠军。 ... [详细]
  • svnWebUI:一款现代化的svn服务端管理软件
    svnWebUI是一款图形化管理服务端Subversion的配置工具,适用于非程序员使用。它解决了svn用户和权限配置繁琐且不便的问题,提供了现代化的web界面,让svn服务端管理变得轻松。演示地址:http://svn.nginxwebui.cn:6060。 ... [详细]
  • Apache Shiro 身份验证绕过漏洞 (CVE202011989) 详细解析及防范措施
    本文详细解析了Apache Shiro 身份验证绕过漏洞 (CVE202011989) 的原理和影响,并提供了相应的防范措施。Apache Shiro 是一个强大且易用的Java安全框架,常用于执行身份验证、授权、密码和会话管理。在Apache Shiro 1.5.3之前的版本中,与Spring控制器一起使用时,存在特制请求可能导致身份验证绕过的漏洞。本文还介绍了该漏洞的具体细节,并给出了防范该漏洞的建议措施。 ... [详细]
  • 本文介绍了在Ubuntu 11.10 x64环境下安装Android开发环境的步骤,并提供了解决常见问题的方法。其中包括安装Eclipse的ADT插件、解决缺少GEF插件的问题以及解决无法找到'userdata.img'文件的问题。此外,还提供了相关插件和系统镜像的下载链接。 ... [详细]
author-avatar
mobiledu2502884677
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有