专栏首页大闲人柴毛毛高质量编程的金玉良言——依赖倒转原则

高质量编程的金玉良言——依赖倒转原则

生活中的例子:

电脑的品牌有很多,但电脑中的所有部件都有标准的接口,不同的厂家都是按照标准去生产各个部件,这些部件的内部实现不同,但接口都是一样的,这样的话,如果我的联想电脑的内存条坏了,我随便买一根内存条插上都能使用。

之所以我们的电脑能使用任何厂家生产的内存条,是因为这些电脑生产厂家都是“面向接口”生产,而在软件世界中,面向接口编程就是依赖倒转。

依赖倒转的官方定义:

1.高层模块不应该依赖于低层模块,他们都应该依赖于抽象;

2.抽象不应该依赖于细节。细节应该依赖于抽象。

大白话讲:

高层模块:调用模块;低层模块:被调用模块。

高层模块中引用类型的变量不应该指向某一个具体的实现类,而应该指向一个抽象类或接口。

低层模块应该是一个接口/抽象类的实现类/子类。

面向实现编程的弊处:

如果是面向实现编程,即高层模块调用低层具有实现的函数,那么当高层模块想要换一种实现的时候,就需要修改高层模块的代码,让它调用另外一个具有实现的函数。这里由于修改了客户端的代码,所以破坏了“封闭修改”的原则。

面向接口编程的好处:

若高层模块一开始调用的是接口中的抽象函数,那么当高层类需要换一个函数实现的时候,高层类就不需要修改任何代码,在低层模块中创建一个实现接口的类,并重写接口中的函数,然后在高层类/低层类中创建实现类的对象并赋给抽象接口的引用即可。

高层类想要换一种实现,实现可以在高层类中换,也可以在低层类中换,最好的做法是在配置文件中换。

1.高层类中换实现

当低层类创建完一个新的实现类之后,在高层类中需要调用实现类函数的地方作如下修改:

接口 接口对象 = new 旧的实现类();——>接口 接口对象 = new 新的实现类();

这种方式在客户端仍然需要修改。

2.在低层类中换实现

低层类中需要再创建一个工厂,接口引用究竟指向哪个实现类的对象就由工厂类决定:

class Factory(){

接口  getBean(){

return new  旧的实现类();

}

}

class Factory(){

接口  getBean(){

return new  新的实现类();

}

}

3.在配置文件中更换实现

Spring采用了一种更加科学的方式,在配置文件中配置接口对应的实现类是哪一个。这样在程序运行的过程中,首先会读取配置文件,将用户指定的那个实现类的对象赋给接口引用。

如果用户想修改一种实现,只需在配置文件中换一下即可。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • MyBatis源码解析(二)——动态代理实现函数调用

    如果我们要使用MyBatis进行数据库操作的话,大致要做两件事情: 1. 定义DAO接口 在DAO接口中定义需要进行的数据库操作。 2. 创建映射文...

    大闲人柴毛毛
  • 手把手0基础项目实战(三)——教你开发一套电商平台的安全框架

    写在最前 本文是《手把手项目实战系列》的第三篇文章,预告一下,整个系列会介绍如下内容: 《手把手0基础项目实战(一)——教你搭建一套可自动化构建的微服务框架(S...

    大闲人柴毛毛
  • 深入理解JVM(八)——类加载的时机

    类的生命周期 一个类从加载进内存到卸载出内存为止,一共经历7个阶段: 加载——>验证——>准备——>解析——>初始化——>使用——>卸载 其中,类加载包括...

    大闲人柴毛毛
  • 接口自动化测试从入门到高级实战

    接口测试是测试系统组件间接口(API)的一种测试,主要用于检测内部与外部系统、内部子系统之间的交互质量,其测试重点是检查数据交换、传递的准确性,控制和交互管理过...

    霍格沃兹测试开发
  • 接口分类

    张树臣
  • Gof设计模式之七大设计原则(六)

    前言 今天的设计原则重理论,举例子只能是文字形式,没法使用代码解释,希望大家可以多读几遍。真正体会到设计原则的好处。每一个设计原则,我都尽量用非...

    用户1257393
  • GSM Communication on EBox4300--(2)

      上一篇GSM Communication on EBox4300--(1)主要是关于EBox4300上实现GSM通信的框架。这次就讲讲如何设计包含西门子TC...

    ShiJiong
  • Go 语言面向对象教程 —— 接口篇:接口定义与实现

    接口在 Go 语言中有着至关重要的地位,如果说 goroutine 和 channel 是支撑起 Go 语言并发模型的基石,那么接口就是 Go 语言整个类型系统...

    学院君
  • 需要接口管理的你了解一下?

    在日常的开发模式里,前端需要服务端提供的接口实现动态数据展示和交互时,服务端完成接口开发后会提供一个接口文档给到前端按照文档规范再进行开发。这样模式下往往会出现...

    闻人的技术博客
  • python接口自动化(三)--如何设计接口测试用例(详解)

      上篇我们已经介绍了什么是接口测试和接口测试的意义。在开始接口测试之前,我们来想一下,如何进行接口测试的准备工作。或者说,接口测试的流程是什么?有些人就很好奇...

    北京-宏哥

扫码关注云+社区

领取腾讯云代金券