设计模式七大原则之依赖倒转

什么是依赖倒转原则?

依赖倒转原则是基于这样的理念: 相对于细节的多变性, 抽象的东西要稳定的多。以抽象为基础搭建的架构比以细节为基础的架构要稳定的多。在java中, 抽象值得是接口或抽象类,细节就是具体的实现类。其核心的思想就是面向接口编程
应当遵循高层模块不应该依赖底层模块, 二者都应该是依赖其抽象。
抽象不应该依赖细节,细节应该依赖于抽象。

为什么要设计依赖倒转原则?

(1) 制定规范
(2) 利于程序扩展和优化
(3) 代码阅读性更强

案例演示01 - 非依赖倒转

有一个Person类,其中有一个用来接收信息的receive()方法
public class Normal {
    public static void main(String[] args) {
        /***
         * 没有使用依赖倒转原则,方案比较简单
         * 此处只有一个信息来源就是邮件,那么后续如果有更多的其他信息来源,例如: 微信、短信、QQ等。则新增类时,同时Person也需要跟着改变,
         * 增加相应的接收方法。
         */
        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";
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章