博客信息

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

发布时间:『 2020-03-06 08:30』  博客类别:23种设计模式  阅读(600)
  • 概念

    高层模块不应该依赖低层模块,二者都应该依赖其抽象 抽象不应该依赖细节,细节应该依赖抽象 依赖倒转(倒置)的中心思想是面向接口编程 低层模块尽量都要有抽象类或接口,或者两者都有,程序稳定性更好 变量的声明类型尽量是抽象类或接口, 这样我们的变量引用和实际对象间,就存在一个缓冲层,利于程序扩展和优化

  • 使用前

    需求:老师通过不同的APP与学生聊天

    实现老师通过微信、扣扣的方式,完成与学生互动需求;

    package com.javaxl.design.rules.relyOn.before;

    /**
    * @author 小李飞刀
    * @site www.javaxl.com
    * @company
    * @create  2020-02-16 11:51
    */
    public class Teacher {
      public void receiveWeiXin(WeiXin weiXin){
          System.out.println(weiXin.getInfo());
      }

      public void receiveQQ(QQ qq){
          System.out.println(qq.getInfo());
      }
    }

    class WeiXin{
      public String info;

      public String getInfo() {
          return info;
      }

      public WeiXin(String info) {
          this.info = info;
      }
    }

    class QQ{
      public String info;

      public String getInfo() {
          return info;
      }

      public QQ(String info) {
          this.info = info;
      }
    }


    public class Client {
      public static void main(String[] args) {
          Teacher teacher = new Teacher();
          teacher.receiveQQ(new QQ("qq发送的消息"));
          teacher.receiveWeiXin(new WeiXin("微信发送的消息"));
      }
    }

    需求变更:老师新增了一个渠道“钉钉”获取学生的信息

    package com.javaxl.design.rules.relyOn.beforePlus;

    /**
    * @author 小李飞刀
    * @site www.javaxl.com
    * @company
    * @create  2020-02-16 11:51
    */
    public class Teacher {
      public void receiveWeiXin(WeiXin weiXin){
          System.out.println(weiXin.getInfo());
      }

      public void receiveQQ(QQ qq){
          System.out.println(qq.getInfo());
      }

      public void receiveDing(DingDing dingDing){
          System.out.println(dingDing.getInfo());
      }
    }

    class WeiXin{
      private String info;

      public String getInfo() {
          return info;
      }

      public WeiXin(String info) {
          this.info = info;
      }
    }

    class QQ{
      private String info;

      public String getInfo() {
          return info;
      }

      public QQ(String info) {
          this.info = info;
      }
    }

    class DingDing{
      private String info;

      public String getInfo() {
          return info;
      }

      public DingDing(String info) {
          this.info = info;
      }
    }

    public class Client {
      public static void main(String[] args) {
          Teacher teacher = new Teacher();
          teacher.receiveQQ(new QQ("qq发送的消息"));
          teacher.receiveWeiXin(new WeiXin("微信发送的消息"));
          teacher.receiveDing(new DingDing("钉钉发送的消息"));
      }
    }

  • 使用后

    实现老师通过微信、扣扣的方式,完成与学生互动需求;

    package com.javaxl.design.rules.relyOn.after;

    /**
    * @author 小李飞刀
    * @site www.javaxl.com
    * @company
    * @create  2020-02-16 12:01
    */
    public class Teacher {
      public void receive(App app){
          System.out.println(app.getInfo());
      }
    }
    interface App{
      String getInfo();
    }

    class WinXin implements App{
      private String info;

      public WinXin(String info) {
          this.info = info;
      }

      @Override
      public String getInfo() {
          return info;
      }
    }

    class QQ implements App{
      private String info;

      public QQ(String info) {
          this.info = info;
      }

      @Override
      public String getInfo() {
          return info;
      }
    }


    public class Client {
      public static void main(String[] args) {
          Teacher teacher =new Teacher();
          teacher.receive(new WinXin("微信发来的消息"));
          teacher.receive(new QQ("qq发来的消息"));
      }
    }

需求变更:老师新增了一个渠道“钉钉”获取学生的信息

package com.javaxl.design.rules.relyOn.afterPlus;

/**
* @author 小李飞刀
* @site www.javaxl.com
* @company
* @create  2020-02-16 12:01
*/
public class Teacher {
  public void receive(App app){
      System.out.println(app.getInfo());
  }
}

interface App{
  String getInfo();
}

class WinXin implements App {
  private String info;

  public WinXin(String info) {
      this.info = info;
  }

  @Override
  public String getInfo() {
      return info;
  }
}

class QQ implements App {
  private String info;

  public QQ(String info) {
      this.info = info;
  }

  @Override
  public String getInfo() {
      return info;
  }
}

class DingDing implements App {
  private String info;

  public DingDing(String info) {
      this.info = info;
  }

  @Override
  public String getInfo() {
      return info;
  }
}


public class Client {
  public static void main(String[] args) {
      Teacher teacher =new Teacher();
      teacher.receive(new WinXin("微信发来的消息"));
      teacher.receive(new QQ("qq发来的消息"));
      teacher.receive(new DingDing("钉钉发来的消息"));
  }
}

从上面可以看出

使用依赖倒转原则前:调用方-高层模块(Teacher类)依赖低层模块(WinXin类、QQ类),这样造成的后果就是,当低层模块扩展,需要高层模块做出一定的调整;这就违反了ocp原则;

使用依赖倒转原则后:调用方-高层模块(Teacher类)依赖低层模块对应的抽象(App接口),此时低层模块发生扩展,高层模块不受影响,这符合ocp原则;



over......


关键字:     设计模式  

备案号:湘ICP备19000029号

Copyright © 2018-2019 javaxl晓码阁 版权所有