1. 什么是依赖倒转原则
- 高层模块不应该依赖于低层模块,二者都应该依赖其抽象
- 抽象不应该依赖细节,细节应该依赖于抽象.抽象指的就是抽象类和接口
- 其中心思想就是面向接口编程
- 使用接口和抽象类的目的是制定规范,而不设计任何具体的操作,把细节交给实现类去完成
- 通俗来讲就是,我们不应该创建一个孤零零的类,而应该创建接口,规定好方法,以及每个方法的功能,然后具体的方法实现由实现类操作,而我们在就进行方法调用时,应该是通过接口来调用方法,而不是直接new一个实现类的直接对象出来,使用方式可以用多态的形式通过父类对象引用指向子类对象
2. 实例
- 不使用依赖倒转的情况
- 这样看上去很简单,但是如果要再加一个短信发送,然后再加一个微信发送呢
public class DependenceInversion {
public static void main(String[] args) {
Person person = new Person();
person.getInfo(new Email());
}
}
class Email{
public void getInfo(){
System.out.println("接收email邮件");
}
}
class Person{
public void getInfo(Email email){
email.getInfo();
}
}
- 增加微信消息的方法
- 这样,我们需要再创建一个微信类然后再person类中再加一个微信发送的方法
- 发送的形式越多,我们在person类中增加的方法也就越多,然而实际上我们每次调用,都只需要其中的一种方法
public class DependenceInversion {
public static void main(String[] args) {
Person person = new Person();
person.getEmailInfo(new Email());
person.getWeixinInfo(new Weixin());
}
}
class Email{
public void getInfo(){
System.out.println("接收email邮件");
}
}
class Weixin{
public void getInfo(){
System.out.println("接收微信消息");
}
}
class Person{
public void getEmailInfo(Email email){
email.getInfo();
}
public void getWeixinInfo(Weixin weixin){
weixin.getInfo();
}
}
3. 改进
- 创建一个接口’Info’,在其中规定一个getInfo的方法
- 创建Email类与Weixin类,都实现Info接口,并实现getInfo方法
- 而在person中,我们只需要创建一个’getInfo’的方法用于接收消息,方法参数为接口’Info’对象
- 通过多态的特性我们可以知道,当形参使用了接口对象时,那么实际传进来的参数可以是该接口的任何子类
- 所以在person中,只需要调用Info.getInfo()方法,就行了,至于调用的具体是email还是weixin就不用考虑了,那是调用方考虑的事
- 当调用方调用person.getInfo方法时,传的是Info的哪个子类对象,就调用哪个子类对象的实现方法
- 无论有再多获取信息的形式,就算再加一个短信获取,加一个qq信息获取,只要需要创建一个对象,实现Info接口就行了,Person中不需要做任何改动
- 这就是依赖倒倒置原则,不依赖与直接对象,而依赖于对象的抽象
public class DependenceInversion {
public static void main(String[] args) {
Person person = new Person();
person.getInfo(new Email());
person.getInfo(new Weixin());
}
}
interface Info{
void getInfo();
}
class Email implements Info{
public void getInfo(){
System.out.println("接收email邮件");
}
}
class Weixin implements Info{
@Override
public void getInfo() {
System.out.println("接收微信消息");
}
}
class Person{
public void getInfo(Info info){
info.getInfo();
}
}