依赖倒置 (DIP)
- 原始定义
a. 高层模块不应依赖低层模块,两者应都依赖其抽象
b. 抽象不应依赖细节
c. 细节应依赖抽象
(细节即实现类,抽象即接口或抽象类)
- 在Java中的表现:
a. 模块间的依赖通过抽象发生,实现类之间不发生直接的依赖关系,其依赖关系是通过接口或抽象类产生的
b. 接口或抽象类不依赖于实现类
c. 实现类依赖接口或抽象类
在开发中使用依赖倒置还能帮助测试,比如JMock 和 easyMock都可以对接口进行Mock,单元测试更加方便。两个类有依赖关系,只要制定两者接口,就可以独立开发,单元测试也可以独立运行,而TDD(Test-Driven Development,测试驱动开发)开发模式就是依赖倒置原则的最高应用。
依赖倒置的三种方式
- 构造函数方式
- 方法注入
- 接口注入(本质上和方法注入差不多,还会引入更多的类,一般不推荐)
依赖倒置 可以轻松对待需求变化的情况,使项目容易拓展 和 维护
接口隔离
- 尽量建立单一的接口,不要建立臃肿的接口,但也不要一个方法一个接口,那样粒度太细,尽量做到一个业务模块 对应一个接口
- 单一接口粒度很小,使系统的灵活性上升,但会是类结构复杂度上升,需要仔细权衡