依赖倒置原则
Posted veda0612
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了依赖倒置原则相关的知识,希望对你有一定的参考价值。
介绍依赖倒置原则的相关概念,建议reading time : 5mins
一、基本定义
依赖倒置原则(Dependence Inversion Principle,简称DIP)的原始定义是:高层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。
Another method of definition: 在Java中的表现是,接口或抽象类不依赖于实现类,即针对接口编程,不要针对实现编程。
二、依赖倒置的三种实现方式
1、通过构造函数传递依赖对象
比如在构造函数中的需要传递的参数是抽象类或接口的方式实现。
2、通过setter方法传递依赖对象
该依赖的特点是依赖对象和引用对象的生命周期一般不是同步的,也有可能不是必须的。
3、接口声明实现依赖对象。
三、依赖倒置原则的优点
1.可以减少类间的耦合性,将每个类之间的依赖关系降到最低,相互依赖变少了,则系统的稳定性也会提高。
2.有利于代码的扩展和维护,因为只用抽象来表示依赖关系,就可以使用该抽象类型的所有子类。
3.降低并行开发引起的风险。
四、举例说明
图1 司机驾驶奔驰车类
司机源码为:
public class Driver{
public void driver(Benz benz){
benz.run();
}
}
奔驰车源码为:
public class Benz{
public void run(){
System.out.println("奔驰开始运行");
}
}
场景类源代码,例如满足客户Tom的需求
public class Client{
public static void main(String[] args){
Driver Tom = new Driver();
Benz benz = new Benz();
Tom.drive(benz);
}
}
以上只是完成了基本需求,如果出现一个新要求:Tom不仅要开奔驰车,还要开宝马的时候,这个时候有宝马车源码为:
宝马车源码为:
public class BMW{
public void run(){
System.out.println("宝马开始运行");
}
}
此时存在一个问题,虽然宝马车有了,但是客户Tom确没办法开,除非改Driver类的方法,因为司机类和奔驰车类之间是一个紧耦合关系,这里新增加一个车类就要修改driver类,做一些修改,建立两个接口:IDriver 和 ICar ,如下图所示:
图2 引入依赖倒置原则后
司机接口:
public interface IDriver{
public void driver(ICar car);
}
场景类源代码,依然满足客户Tom开奔驰车的需求,要开宝马车的话,就改变车类就行了。
public class Client{
public static void main(String[] args){
IDriver Tom = new Driver();
ICar benz = new Benz();
Tom.drive(benz);
}
}
总而言之, 依赖倒置的本质原则就是 :通过抽象(接口或抽象类)使各个类或模块实现彼此独立,互不影响,实现模块间的松耦合。
以上是关于依赖倒置原则的主要内容,如果未能解决你的问题,请参考以下文章