六大设计原则之依赖反转(依赖倒置)

发布于:2023-01-14 ⋅ 阅读:(453) ⋅ 点赞:(0)

什么是依赖反转(依赖倒置)?

百度百科:
在面向对象编程领域中,依赖反转原则(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);

高层模块不应该去依赖底层模块,这种现象会使得程序的耦合度非常高。 形象的证实了这句话。

如何解决?

使高层模块和低层模块两者都依赖一个抽象。
在这里插入图片描述
对上述代码进行修改:

  1. 创建出这个抽象
public interface ISendMsg {
    void sendMsg();
}
  1. 高层模块
public class sendMsg {
	// 依赖该抽象
    public void sendMsg(ISendMsg sendMsg) {
        sendMsg.sendMsg();
    }
}
  1. 低层模块
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");
    }
}
  1. 执行程序
sendMsg sendMsg = new sendMsg();
sendMsg.sendMsg(new QQ());
sendMsg.sendMsg(new Wechat());

如需扩展功能,只需:

  1. 创建一个TikTok类,实现ISendMsg
  2. 直接调用sendMsg.sendMsg(new TikTok())

如需有变更业务等需求时,只需要修改我们低层代码,而不许要去变更高层代码,它们直接互不影响。

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到