依赖倒置(DIP)、控制反转(IOC)、依赖注入(DI)

依赖倒置 (Dependency Inversion Principle, 即DIP):
    1. 原始定义:High level modules should not depend upon low level modules. Both should depend upon abstractions. Abstractions should not depend upon details. Details should depend upon abstractions。
    2. 官方翻译:高层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象。
    3. 自我理解:前一句话是指实现类之间不应该产生直接的依赖关系,其依赖关系应该是由抽象产生,也就是接口,以此来实现解耦。后一句是指实现类应该依赖于接口,而不是接口依赖于实现类。
    在一个系统中,存在高层与低层,高层使用低层对象来提供对应的服务以实现自身的业务逻辑,也就是所谓的“高层依赖于底层”。当高层业务增加,低层所提供的服务不能满足要求时,需要对低层对象代码进行大量修改,高层与低层之间耦合度过高。这时候就可以对低层对象进行抽象化,即面向接口编程,高层对象只需要对接口进行操作,低层也只需要面对接口进行补充修改即可,。
    4. 为什么叫“依赖倒置”而不是“依赖接口”:     按照常理,此接口是低层对象的抽象,那就应该也属于低层部分。  当项目需求发生变化,高层需要完成新的业务,低层要就需要负责提供对应的业务,接口便需要发生变化。如果接口是位于低层,那也就需要由低层开发人员来维护,可低层开发人员并不需要负责业务逻辑,也就是他们并不知道业务的具体需求而无法去规定接口需要提供哪些服务。这时,就可以将接口看做是高层的一部分,由高层开发人员来维护。 因此这里的“倒置”是指:将本应放在低层的接口放置到高层,低层的实现需要依赖高层的接口去实现相应的服务。
    5. 带来的好处:①可以降低类之间的耦合性。②提高系统的稳定性。③提高代码的可读性和可维护性。

控制反转 (Inversion of Control, 即IOC):
    1. 简单来说就是从主动new创建某个需要使用的对象变成了由容器外部创建好并注入进来。 当Class A需要调用Class B提供的某个方法时,一般在Class A中需要对Class B先进行显式的实例化创建。而采用依赖注入方式后,A中的代码只需要声明一个private B对象,不需要实例化,而是通过相关的容器控制程序在外部创建B对象再注入到A中的引用即可。
    2. 为什么叫“控制反转”:在原系统中,A依赖于B,在A初始化或者运动到某个时刻时需要显式的new创建B对象并使用,此时控制权位于A中。而引入IOC后,获得依赖对象的过程被反转了。获得依赖的过程由自身控制转为了由IOC容器注入,这也就引入了依赖注入(DI)这个概念。
    3. 带来的好处:使得依赖方不再需要关注被依赖对象的创建,只需要使用传入的被引入对象即可。IOC配合面向接口编程,使得编写的程序扩展性更强。

依赖注入(Dependency Injection,即DI):
    1. 由IOC容器在运行期间,动态的将某种依赖关系注入到对象之中,一般利用反射机制。它是作为实现控制反转的一种手段。


参考文章:
- [依赖反转(依赖倒置)原则之“反转(倒置) "](https://www.jianshu.com/p/8d7723cd4e24)
- [依赖倒置原则的“倒置”体现在哪里,”依赖倒置“为什么不叫”依赖转移“而叫”倒置“(高人勿入)](https://q.cnblogs.com/q/72496/)
- [依赖倒置DIP+控制反转IOC+依赖注入DI](https://zhuanlan.zhihu.com/p/45440992)
- [一文读懂依赖倒置、依赖注入、控制反转](https://jerrymei.cn/dip-loc/)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NCU-wfb

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值