依赖倒置原则
1.起源与定义
1.1起源
依赖倒置原则是Robert C. Martin在1996年为“C++Reporter”所写的专栏Engineering Notebook的第三篇,后来加入到他在2002年出版的经典著作“Agile Software Development, Principles,Parrerns,and Practices”一书中。

1.2.定义
依赖倒转原则(Dependency Inversion Principle, DIP):抽象不应该依赖于细节,细节应当依赖于抽象。换言之,要针对接口编程,而不是针对实现编程。以Java为例,针对接口编程的意思就是说,应当使用Java接口和抽象Java类进行变量的类型声明、参量的类型声明、方法的返还类声明,以及数据类型的转换等。不针对实现编程就是说,不应当使用具体Java类进行变量的类型声明、参数量的类型声明、方法的返还类型声明,以及数据类型的转换等。依赖倒置关系强调一个系统内的实体之间关系的灵活性。
2.依赖倒置的实现
在实现依赖倒转原则时,我们需要针对抽象层编程,而将具体类的对象通过依赖注入 (DependencyInjection, DI)的方式注入到其他对象中,依赖注入是指当一个对象要与其他对象发 生依赖关系时,通过抽象来注入所依赖的对象。常用的注入方式有三种,分别是:构造注入,设值注入和接口注入这些方法在定义时使用的是抽象类型,在运行时再传入具体类型 的对象,由子类对象来覆盖父类对象。下面我们以一个例子来具体分析。

上面的设计没有使用依赖倒置原则,模块与模块之间耦合度太高,生产力太低,只要需求一变就需要大面积重构,说明这样的设计是不合理。
注:下面所列代码皆以上述图片例子为基础
2.1构造注入
构造注入是指通过构造函数来传入具体类的对象。如在上述例子中增加Food类的构造函数。
1 public interface IChef{ 2 public void cook(); 3 } 4 public class Chef Implements IChef{ 5 private IFood food; 6 7 public void Chef(IFood food) 8 { 9 this.food = food; 10 } 11 public void cook(IFood food) 12 { 13 this.food.cook(); 14 } 15 }
2.2设值注入
设值注入是指通过Setter方法来传入具体类的对象。如在上述例子中加入food的Setter方法。
public interface IChef{ public void setFood(IFood food); public void cook(); } public class Chef implements IChef{ private IFood food; public void setFood(IFood food){ this.food = food; } public void cook(){ this.food.cook(); } }
2.3接口注入
接口注入是指通过在接口中声明的业务 方法来传入具体类的对象。如在上述例子中将Chef和Food写为接口,具体的厨师和食物通过接口实现。
public interface IChef { public void cook(IFood food); } public class Chef implements IChef{ public void cook(IFood food){ food.cook(); } } public interface IFood { public void cook(); } public class Steak implements IFood{ public void cook(){ System.out.println("牛排正在制作"); } } public class Noodle implements IFood{ public void cook(){ System.out.println("面条正在制作"); } } public class Customer{ public static void main(String[] args) { IChef chef = new Chef(); IFood steak = new Steak(); chef.cook(steak); } }
3.依赖倒置原则的作用
依赖倒置原则有以下主要作用:(1)依赖倒置原则可以降低类间的耦合性;(2)依赖倒置原则可以提高系统的稳定性;(3)依赖倒置原则可以减少并行开发引起的风险;(4)依赖倒置原则可以提高代码的可读性和可维护性。
参考链接:http://c.biancheng.net/view/1326.html
https://wenku.baidu.com/view/2b48cb6348d7c1c708a14534.html
https://blog.csdn.net/king123456man/article/details/81626127
https://www.jianshu.com/p/c3ce6762257c

浙公网安备 33010602011771号