设计模式——依赖倒置(倒转)原则

基本介绍

依赖倒置原则是指:

  1. 高层模块不应该依赖低层模块,二者都应该依赖其抽象。
  2. 抽象不应该依赖细节,细节应该依赖抽象。
  3. 依赖倒转的中心思想是面向接口编程。
  4. 依赖倒转的设计理念为:相对于细节的多变性,抽象的东西要稳定的多。以抽象的基础搭建的架构比以细节为基础的架构要稳定的多。在java中,抽象指的是接口或抽象类,细节就是具体的实现类。
  5. 使用接口或抽象类的目的是制定好规范,而不涉及任何具体的操作,把展现细节的任务交给他们的实现类去完成。

实例分析

模拟信息发送

class Email {
    public String getInfo() {
        return "电子邮件信息";
    }
}

class Person {
    public void receive(Email email) {
        System.out.println(email.getInfo());
    }
}

public static void main(String[] args) {
    Person person = new Person();
    person.receive(new Email());
}

分析:如果获取信息的对象是微信,短信等等,则需要增加类,同时Person也要增加相应的接收方法。如下所示:

class Email {
    public String getInfo() {
        return "电子邮件信息";
    }
}
class WeiXin {
    public String getInfo() {
        return "微信件信息";
    }
}

class Person {
    public void receiveByEmail(Email email) {
        System.out.println(email.getInfo());
    }
    public void receiveByWeiXin(WeiXin weiXin) {
        System.out.println(weiXin.getInfo());
    }
}

public static void main(String[] args) {
    Person person = new Person();
    person.receiveByEmail(new Email());
    person.receiveByWeiXin(new WeiXin());
}

很显然,这样做很麻烦。可以做如下修改:

引入一个抽象的接口IReceiver,表示接收者,这样Person类与接口IReceiver发生依赖。因为Email, WeiXin等属于接收的范围,它们各自实现IReceiver接口便符合依赖倒置的原则。修改如下所示:

public interface IReceiver {
    public String getInfo();
}

class Email implements IReceiver {

    @Override
    public String getInfo() {
        return "电子邮件接收信息";
    }
}

class WeiXin implements IReceiver {

    @Override
    public String getInfo() {
        return "微信接收信息";
    }
}

class Person {
    public void receiver(IReceiver receiver) {
        System.out.println(receiver.getInfo());
    }
}

public static void main(String[] args) {
    Person person = new Person();
    person.receiver(new Email());
    person.receiver(new WeiXin());
}

这样做,即便增加新的方式,也只需要新增类去实现IReceiver接口即可,不必修改过多的代码。

总结

  1. 低层模块尽量都要有抽象类或接口,或者两者都有,程序稳定性好。
  2. 变量的声明类型尽量是抽象类或接口,这样我们的变量引用和实际对象间,就存在一个缓冲层,利于程序扩展和优化。
  3. 继承时遵循里氏替换原则。

补充

依赖传递的三种方式

接口传递

interface IOpenAndClose {
    public void open(ITV tv);
}
interface ITV {
    public void play();
}
class OpenAndClose implements IOpenAndClose {

    @Override
    public void open(ITV tv) {
        tv.play();
    }
}

构造方法传递

interface IOpenAndClose {
    public void open();
}
interface ITV {
    public void play();
}
class OpenAndClose implements IOpenAndClose {
    public ITV tv;
    public OpenAndClose(ITV tv) {
        this.tv = tv;
    }
    @Override
    public void open() {
        this.tv.play();
    }
}

setter方式传递

interface IOpenAndClose {
    public void open();
    public void setTv(ITV tv);
}
interface ITV {
    public void play();
}
class OpenAndClose implements IOpenAndClose {
    public ITV tv;
    @Override
    public void setTv(ITV tv) {
        this.tv = tv;
    }
    @Override
    public void open() {
        this.tv.play();
    }
}

你可能感兴趣的:(设计模式,设计模式,依赖倒置原则,java)