什么是依赖倒转原则?
依赖倒转原则是基于这样的理念: 相对于细节的多变性, 抽象的东西要稳定的多。以抽象为基础搭建的架构比以细节为基础的架构要稳定的多。在java中, 抽象值得是接口或抽象类,细节就是具体的实现类。其核心的思想就是面向接口编程
应当遵循高层模块不应该依赖底层模块, 二者都应该是依赖其抽象。
抽象不应该依赖细节,细节应该依赖于抽象。
为什么要设计依赖倒转原则?
(1) 制定规范
(2) 利于程序扩展和优化
(3) 代码阅读性更强
案例演示01 - 非依赖倒转
有一个Person类,其中有一个用来接收信息的receive()方法
public class Normal {
public static void main(String[] args) {
Person person = new Person();
person.receive(new Email());
}
}
class Person {
public void receive(Email email) {
email.getInfo();
}
}
class Email {
public String getInfo() {
return "电子邮件消息: test";
}
}
这种方案没有采用依赖倒转,模式比较简单。但是不利于后期程序的扩展。因为目前只有一种信息来源就是邮件, 假设后期有多种信息来源,例如: 微信、短信、QQ等。那么就要对于Person类增加相对应的代码,从而导致代码变得冗长,可读性和维护性都会降低
案例演示02 - 依赖倒转
我们可以基于多种信息来源的方式抽象一个接口出来,在接口中定义一个getInfo() 方法。具体的信息来源类都实现这个接口。在需要获取信息的时候依赖于接口,这样既有利于代码的扩展性,也同时使用到了依赖倒转原则
public class DepencyVersion {
public static void main(String[] args) {
Person person = new Person();
person.getInfo(new Wechat());
person.getInfo(new QQ());
person.getInfo(new Sms());
person.getInfo(new Email());
}
}
class Person {
public void getInfo(IReceiver receiver) {
System.out.println(receiver.getInfo());
}
}
interface IReceiver {
String getInfo();
}
class Wechat implements IReceiver {
@Override
public String getInfo() {
return "微信消息: test";
}
}
class QQ implements IReceiver {
@Override
public String getInfo() {
return "QQ消息: test";
}
}
class Sms implements IReceiver {
@Override
public String getInfo() {
return "短信消息: test";
}
}
class Email implements IReceiver {
@Override
public String getInfo() {
return "邮件消息: test";
}
}