设计模式原则之:依赖倒转原则
基本介绍:
- 高层模块不应该依赖与底层模块,二者都应该依赖其抽象
- 抽象不应该依赖细节,细节应该依赖抽象
- 依赖倒转(倒置)的中心思想是面向接口编程
- 依赖倒转原则是基于这样的设计理念:相对于细节的多变性,抽象的东西要稳定的多。以抽象为基础搭建的架构比以细节为基础的架构要稳定的多,在Java中,抽象指的是接口或抽象类,细节就是具体的实现类
- 使用接口或抽象类的目的是制定好规范,而不涉及任何具体的操作,把展现细节的任务交给它们的实现类去完成
错误的案例+分析说明
/**
* @description: 依赖倒转错误案例
* @author: abel.he
* @date: 2023-08-02
**/
public class DependencyInversionError {
public static void main(String[] args) {
Person person = new Person();
person.receive(new Email());
}
}
class Email {
public String info() {
return "电子邮件信息:info";
}
}
/**
* 完成Person接受消息的功能
* 分析:
* 1、简单、比较容易得到
* 2、如果增加其他方法 如微信,短信等等 则新增类,同时Person也要增加相应的接受方法
* 3、解决思路,引入一个抽象接口IReceiver,表示接受者,这样Person类与接口IReceiver发生依赖
* 微信,短信 等等属于接受的范围,它们各自实现IReceiver接口就ok,这样就符合依赖倒转原则
*/
class Person {
public void receive(Email email) {
System.out.println(email.info());
}
}
引出的案例
/**
* @description: 依赖倒转正确案例
* @author: abel.he
* @date: 2023-08-02
**/
public class DependencyInversionCorrect {
public static void main(String[] args) {
Person1 person = new Person1();
person.receive(new Email1());
person.receive(new WeChat());
}
}
interface IReceiver {
String info();
}
class Email1 implements IReceiver {
public String info() {
return "电子邮件信息:info";
}
}
class WeChat implements IReceiver {
@Override
public String info() {
return "微信信息:info";
}
}
class Person1 {
public void receive(IReceiver receiver) {
System.out.println(receiver.info());
}
}