第二周
请描述什么是依赖倒置原则,为什么有时候依赖倒置原则又被称为好莱坞原则?
依赖倒置原则 Dependency Inversion Priciple DIP
- 高层模块,不依赖低层模块,而是大家都依赖于抽象
- 抽象不能依赖实现,而是实现依赖抽象
怎么理解高层、低层模块,可以按数据流向来分析,数据来源是高层,数据接收者是低层,或者按照调用顺序区分,调用者是高层,被调用者是低层
通常而言,遇到的情况是 高层模块 A -> 调用低层模块 B 提供的接口的方法。
比如各种各样的库,都是这样,提供一个接口,然后用户调用这个接口对象的方法
现在,需要倒置过来,即 A 提供一个接口,然后在 A 中,A 主动的调用这个接口的方法,然后,低层 B 去实现 A中的接口,并且 A 持有 B 对象实现的接口的实例,这样的话,A 就可以自动的调用B实现的功能。也就是说,B现在依赖的是高层A提供的接口,而不是A去依赖B了
A : 持有接口 IA,并且其中调用 IA 的方法 funcA
B : implements IA
然后 A 持有 B 实现的 IA,这样的话,A 就可以 调用 IA.funcA()
A 不依赖 B,B也不依赖A,双方都只依赖 IA
另外的常见的例子,比如插件,软件提供了插件接口,用户可以实现各种功能的插件模块,软件会调用这个插件,以提供插件的功能
DIP 倒置了什么?
- 模块和包的依赖关系
如上面例子,倒置后,就不是 A 要持有 对象B了,而是 A 只知道接口 IA - 开发顺序和职责
倒置后,低层 B的开发,只能依赖 A 提供的接口了,也就是开发顺序也倒置了。而不是以前的 A 等着 B 提供一个接口来调用,这样,职责也就倒置了
A 占据主导地位
软件的层次化:
- 高层决定低层
因为 高层框架制定了接口规则,肯定高层决定了低层应该怎么去开发 - 高层被重用
这就理所当然了
框架的核心 : 好莱坞规则 : Don't call me, I'll call you.
框架倒转了层次依赖关系
依赖倒置原则 和 好莱坞规则一致,低层不用调用高层,高层会在适当时机调用低层实现的高层接口方法
请描述一个你熟悉的框架,是如何实现依赖倒置原则的
spring 框架 使用了 依赖倒置原则
比如 ,Controller 的使用
spring 框架规定了 Controller 的定义方式,使用 @Controller 注解 ,以及 map方法的定义方式 使用 @RequestMapping 注解。
所以,用户只需要按照 spring 框架提供的方式,来实现自己的 bean,spring 就会在启动时,收集用户定义的 bean,并创建实例,然后在对应请求到来时,调用用户定义的 map 方法来处理请求
在整个过程中,spring 并不依赖 用户定义的接口类等,而只依赖spring本身定义的规则,而 用户,必需按照spring定义的方式来实现 spring 框架能运行的代码,也就是用户依赖 着spring框架。这也就是依赖倒置原则。