0 概述
依赖倒置原则(Dependence Inversion Principle)是程序要依赖于抽象接口,不要依赖于具体实现。简单的说就是要求对抽象进行编程,不要对实现进行编程,这样就降低了客户与实现模块间的耦合。来源百度百科
1 依赖倒置理解
A调用B,A对B有依赖,这叫正向依赖。我们一个应用中,应用层会调用基础设施层,这个时候应用层就强依赖基础设施层。写代码顺序是先写基础设施层再写应用层。如下面代码片段,一个根据订单查询服务,OrderQueryServiceImpl 在应用层,Orderepository 在基础设置层;那么依赖关系就是应用依赖基础设置层,依赖导致方法,就是应用层定义好Orderepository接口,让基础设施层去实现;应用层只依赖接口,这个就依赖倒置。这么设计的好处是什么呢?未来基础设施有什么变化应用层不感知这个变化,同时和基础设施层解耦了。spring 容器 实现依赖注入,所依赖的对象直接由 IoC 容器创建后注入到被注入的对象中,依赖的对象由原来的主动获取变成被动接受,所以是反转。
public interface OrderQueryService {
/**
* 根据订单Id查询订单
*/
Result<OrderDTO> getOrder(String orderId);
}
public class OrderQueryServiceImpl implements OrderQueryService {
@Resource
private Orderepository orderepository;
@Override
public Result<OrderDTO> getOrder(String orderId) {
//校验
//查询
OrderDO orderDO= orderepository.getOrder(orderId);
//转换
return Result.succ();
}
}
下面再看下面这个例子,Person依赖了Vehicle这个是正向依赖,那么如何实现人类和汽车解耦呢?那么就是抢夺接口的控制权,即人类抢到drive控制权,人类具有驾驶的能力,这个时候Person 和Vehicle 就解耦了。
//车辆
public interface Vehicle {
}
// 卡车
public class Truck implements Vehicle {
}
//小汽车
public class Car implements Vehicle {
}
// 人类驾驶交通工具
public interface Person {
void drive(Vehicle vehicle);
}
// 下面依赖倒置,解耦做法
public interface Driveable {
}
// 小汽车实现了人类接口
public class Car implements Vehicle , Driveable{
}
public interface Person {
void drive(Driveable driveable);
}
参考文献
[1]https://www.cnblogs.com/chenssy/p/9576769.html