依赖倒置原则
定义
高层模块不要依赖低层模块,应该通过抽象来互相依赖。除此之外,抽象不要依赖具体实现细节,具体实现细节依赖抽象。
个人理解
避免对具体实现类的直接引用,使其付出更小的代价达到扩展的目的,与开闭原则照应。
缺点也是老生常谈的类文件数量增加,可维护性下降。所以要在适当场景使用,切勿过度设计。例如service层定义接口,实际项目中,大部分service只有单一实现,没有定义接口的必要。
示例一
控制反转是一种思想,用来指导框架层面的设计。“控制”指的是对程序执行流程的控制,“反转”指的是由程序员控制转为框架控制。
依赖注入是控制反转具体的一种实现,通过构造函数、set方法将依赖对象注入。依赖注入框架不只有Spring
,还有很多,例如Google Guice
。
示例二
Tomcat和web应用,Tomcat是高层模块,web应用是底层模块。两者没有直接依赖,而是依赖于Servlet规范。
Servlet规范不依赖于Tomcat容器和web应用程序的具体实现。
“基于接口而非实现编程”跟“依赖注入”的联系和区别
联系
两者都是从外部传入对象。
区别
前者强调的是接口,遵守协议,不依赖于具体实现。后者强调的是对象的创建在外部,而不是内部new出来的。