什么是依赖反转(依赖倒置)?
百度百科:
在面向对象编程领域中,依赖反转原则(Dependency inversion principle,DIP)是指一种特定的解耦(传统的依赖关系创建在高层次上,而具体的策略设置则应用在低层次的模块上)形式,使得高层次的模块不依赖于低层次的模块的实现细节,依赖关系被颠倒(反转),从而使得低层次模块依赖于高层次模块的需求抽象。
大概就是说,高层模块不应该去依赖低层模块,这种现象会使得程序的耦合度非常高,而该设计原则,就是为了解决这种耦合关系的。
看一个例子:
// 高层模块
public class sendMsg {
public void sendMsgByQQ(QQ qq) {
qq.msg();
}
public void sendMsgByWechat(Wechat wechat) {
wechat.msg();
}
}
// 低层模块的两个类
public class QQ {
public void msg() {
System.out.println("send a message by qq");
}
}
public class Wechat {
public void msg() {
System.out.println("send a message by Wechat");
}
}
执行程序:
sendMsg sendMsg = new sendMsg();
QQ qq = new QQ();
Wechat wechat = new Wechat();
sendMsg.sendMsgByQQ(qq);
sendMsg.sendMsgByWechat(wechat);
这么一看,该程序好像没有什么问题…
但是,当我们出现一个新的需求时,比如现在要扩展一个发送信息的方式: send message by TikTok
,要做哪些工作?
- 创建
TikTok类
,编写一个msg
方法
public class Wechat {
public void msg() {
System.out.println("send a message by TikTok");
}
}
- 在高层模块SendMsg类中,新增方法
// 高层模块
public class sendMsg {
public void sendMsgByQQ(QQ qq) {
qq.msg();
}
public void sendMsgByWechat(Wechat wechat) {
wechat.msg();
}
public void sendMsgByWechat(Tiktok tiktok) {
tiktok.msg();
}
}
- 通过传入依赖,调用方法?
sendMsg sendMsg = new sendMsg();
QQ qq = new QQ();
Wechat wechat = new Wechat();
TikTok tikTok = new TikTok();
sendMsg.sendMsgByTikTok(tikTok);
sendMsg.sendMsgByQQ(qq);
sendMsg.sendMsgByWechat(wechat);
高层模块不应该去依赖底层模块,这种现象会使得程序的耦合度非常高。 形象的证实了这句话。
如何解决?
使高层模块和低层模块两者都依赖一个抽象。
对上述代码进行修改:
- 创建出这个抽象
public interface ISendMsg {
void sendMsg();
}
- 高层模块
public class sendMsg {
// 依赖该抽象
public void sendMsg(ISendMsg sendMsg) {
sendMsg.sendMsg();
}
}
- 低层模块
public class QQ implements ISendMsg {
@Override
public void sendMsg() {
System.out.println("send a message by qq");
}
}
public class Wechat implements ISendMsg {
@Override
public void sendMsg() {
System.out.println("send a message by Wechat");
}
}
- 执行程序
sendMsg sendMsg = new sendMsg();
sendMsg.sendMsg(new QQ());
sendMsg.sendMsg(new Wechat());
如需扩展功能,只需:
- 创建一个TikTok类,实现ISendMsg
- 直接调用
sendMsg.sendMsg(new TikTok())
如需有变更业务等需求时,只需要修改我们低层代码,而不许要去变更高层代码,它们直接互不影响。
本文含有隐藏内容,请 开通VIP 后查看