1. 定义
代码设计应该依赖于抽象,不应该依赖于实现细节。
换句话说,抽象不应该依赖于细节,细节应该依赖于抽象。说白了,就是要针对接口编程,而非对实现编程。
2. 解读
- 依赖倒置原则其实是面向对象设计的标志,用那种语言实现并不重要,如果编写程序时,考虑的都是如何针对抽象编程,而非是针对细节编程,即程序中所有的依赖关系都终止于抽象类或接口,那就是面向对象的设计,反之就是过程化的设计。
- 为啥叫“依赖倒置”?其实这个名字来源于对于调用关系,调用方(consumer)不再直接依赖于服务的提供方(service provider),相反,调用方和服务的提供方都依赖于交互的接口。
- 我个人的理解是,抽象来源于细节,因此从常识上讲,抽象应该依赖于细节。但我们应当知道,理论(抽象)来源于实践(细节),但高于实践。从实践中总结出理论后,应该用“理论进一步指导实践”,也即实践(细节)依赖于理论(抽象),依赖关系倒置。
- 抽象是稳定的,细节是多变的。让依赖终止于抽象,才能在设计上保障程序的稳定性。
- 在实践中,调用方将不再直接实例化提供方的对象,而是通过CREATION METHOD实例方法来得到依赖的对象。例如通过工厂方法、抽象工厂、原型模式等将实例化的动作与服务相分离。调用方只依赖于CREATION METHO返回的接口对象,而非直接依赖于对象实体。
- DIP其实在一定程度上,是用增加代码复杂度的方式,换取了代码间依赖的灵活性。
- 测试隔离(Test Isolation)是DIP的最好体现,也即用Factory-Injection的模式,实现了Test-Double的注入。
3. 举例
3.1 测试隔离(Factory-Injector Pattern)
Client在访问服务类Service Provider时,仅可通过Factory类得到Service Provider的实例,Factory返回的实例是Service Provider的接口对象。
因此Client与服务提供方,仅依赖于Service Provider的接口。当service provider发生变化时,client方无需改动任何代码,不受任何影响。
此外,通过Injector类的引入,可以在测试代码中替换掉Factory返回的Service Provider实例,也即实现test double。
>本博客专注于技术分享,干货满满,持续更新。
>欢迎关注❤️、点赞👍、转发📣!