依赖反转原则(Dependency Inversion Principle,DIP)
原创大约 3 分钟
依赖反转原则(Dependency Inversion Principle,DIP)也是由罗伯特·C·马丁(Robert Cecil Martin)提出。
过去的软件开发中,高层次的功能总会依赖于低层次功能所提供的支持。但依赖反转原则(Dependency Inversion Principle,DIP)则提出这样的规定
。
高层次的模块不应该依赖于低层次模块的实现,而是它们都应该依赖于
抽象接口
。抽象接口
不应该依赖于具体实现
,而是具体实现
应该反过来依赖于抽象接口
。
依然拿支付应用举例。
如果将支付功能都放在用户实体类User
中,那么就会给User
增加极大的负担,来一个支付接口就得改一次代码,这就是典型的高层次的功能依赖于低层次的实现
。
但是如果使用依赖反转原则(Dependency Inversion Principle,DIP),那么就应该让支付功能依赖于抽象的支付接口
。
package com.itechthink.designrule.dependency;
/**
* 支付接口
*
*/
public interface IPay {
void pay();
}
/**
* 用户支付
*
*/
public class User {
public void aliPay() {
System.out.println("支付宝支付");
}
public void weixinPay() {
System.out.println("微信支付");
}
public void pay(IPay iPay) {
iPay.pay();
}
}
/**
* 支付宝支付
*
*/
public class AliPay implements IPay {
@Override
public void pay() {
System.out.println("支付宝支付");
}
}
/**
* 微信支付
*
*/
public class WeixinPay implements IPay {
@Override
public void pay() {
System.out.println("微信支付");
}
}
可以比较一下使用依赖反转原则(Dependency Inversion Principle,DIP)和不使用它的区别。
package com.itechthink.designrule.dependency;
/**
* 依赖反转原则是指设计代码结构时,高层模块不应当依赖低层模块,二者都应当依赖其抽象
* 抽象不应当依赖细节,细节应当依赖抽象。
* 依赖反转原则可减少类与类之间的耦合性,提高系统的稳定性,提高代码的可读性和可维护性,并且能够降低修改程序带来的风险
*
*/
public class DependencyInversion {
public static void main(String[] args) {
// 不使用依赖反转原则,集成一个支付功能就得改一次代码
User user = new User();
user.aliPay();
user.weixinPay();
// 无论增加多少支付方式,只需要调用实现IPay接口的类即可
user.pay(new AliPay());
}
}
虽然依赖反转(Dependency Inversion Principle,DIP)
和控制反转(Inversion of Control,IoC)
看起来有点像,但它们是两个不同的概念。
依赖反转
是一种软件设计原则
,强调的是抽象接口
和具体实现
之间的耦合
关系。控制反转
则是一种介于设计模式和架构模式之间的东西,它强调的是对象或资源加载的控制权从业务代码层面转移到外部框架层面,最典型的就是Spring IoC。
感谢支持
更多内容,请移步《超级个体》。