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

生活中的例子:

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

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

依赖倒转的官方定义:

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

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

大白话讲:

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

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

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

面向实现编程的弊处:

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

面向接口编程的好处:

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

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

1.高层类中换实现

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

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

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

2.在低层类中换实现

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

class Factory(){

接口  getBean(){

return new  旧的实现类();

}

}

class Factory(){

接口  getBean(){

return new  新的实现类();

}

}

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

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

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

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏技术翻译

Java程序员应该知道的20个有用的库

总的来说,我介绍了一些对于日常项目十分有用的库,包括Log4j等日志库,Jackson等JSON解析库,以及JUnit和Mockito等单元测试API。如果需要...

603
来自专栏Java社区

Java核心技术讲解学习

1063
来自专栏扎心了老铁

Python Redis pipeline操作

Redis是建立在TCP协议基础上的CS架构,客户端client对redis server采取请求响应的方式交互。 一般来说客户端从提交请求到得到服务器相应,需...

4038
来自专栏云计算

重新审视分布式(微服务)体系结构中的全局数据一致性

早在2015年的时候,我写了几篇文章,介绍如何通过搭载标准Java EE事务管理器以获得跨分布式服务的数据一致性(查看原文请点击这里,基于Spri...

1312
来自专栏微服务生态

实现缓存最终一致性的两种方案

问题点:如果更新Redis失败,同时在将数据发到MQ之前的时间,应用重启了,这时候MQ就没有需要更新的数据,如果Redis对所有数据没有设置过期时间,同时在读多...

561
来自专栏编程

初学Java编程需要知道的几大重点步骤

初学Java编程需要知道的几大重点步骤 ? 一、学习前的准备工作 java语言一般用于大型的服务器程序开发,所有有必要了解如下内容:Unix开发环境Unix系统...

1798
来自专栏贾老师の博客

【笔记】 c10K

882
来自专栏蘑菇先生的技术笔记

那些年我们一起追过的缓存写法(二)

2415
来自专栏ImportSource

微服务业务开发三个难题-拆分、事务、查询(下)

上集:微服务业务开发三个难题-拆分、事务、查询(上) 上集我们阐述了使用微服务体系架构的关键障碍是领域模型,事务和查询,这三个障碍似乎和功能拆分具有天然的对抗...

38212
来自专栏杨建荣的学习笔记

生产系统中只读表的实现思路(r2第43天)

在生产系统中有些时候需要保证一些表的只读特性,不允许表的数据被轻易修改。可能有一下的场景比较适用。 1) 一些系统中有一些类似数据字典信息的表。这些表的信息基本...

1965

扫描关注云+社区