依赖倒置原则(Dependence Inversion Principle,DIP)定义:
High level modules should not depend upon low level modules.Both should depend upon abstractions should not depend upon details.Details should depend upon acstractions.
(高层次的模块不应该依赖低层次的模块,他们都应该依赖抽象。 抽象不应该依赖细节,细节应该依赖抽象。)[OOD Object-Oriented Design]
在Java中的表述为:
1、模块间的依赖通过抽象发生,实现类之间不发生直接的依赖关系,其依赖关系是通过接口或者抽象类产生的
2、接口或抽象类不依赖于实现类
3、实现类依赖接口或抽象类
算是优点吧
使用依赖倒置原则能够减少类间的耦合性
eg:
public class Driver {
public void drive(Benz benz)
{
benz.run();
}
}
public class Benz {
public void run()
{
//do something
}
}
public class Client {
public static void main (String[] args)
{
Driver zhangsan = new Driver();
Benz benz = new Benz();
zhangsan.drive(benz);
}
}
上面程序表述的问题,如果司机不仅仅开奔驰车,还要开其他类型的车,程序就不合理了。
解决方法 让司机操作一个不区分类型的车 奔驰什么的依赖于这个不区分类型的车。
这也是依赖倒置原则说明的高层模块不依赖于底层模块,都应该依赖于它的抽象
依赖有三种写法:
1、通过构造函数注入
2、Setter依赖注入
3、接口声明依赖对象(接口注入)
最佳实践:
要遵循以下几点规则
1、每个类都有接口或抽象类,或者抽象类和接口两者都具备
2、变量的表面类型尽量是接口或者抽象类
3、任何类都不应该从具体类派生
4、尽量不要覆写基础类的方法
5、结合里氏替换原则(父类出现的地方子类就能出现)使用
依赖倒置原则是实现开闭原则的重要途径,它没有实现对扩展开放对修改关闭。基本就是"面向接口编程"
网友评论