3. 目标精通--用java写设计模式:依赖倒转原则

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();
    }

}

4.下一章:里氏替换原则

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值