zoukankan      html  css  js  c++  java
  • 依赖倒置原则

    1、依赖倒置原则的定义

      高层模块不应该依赖低层模块,它们都应该依赖抽象。抽象不因该依赖于细节,细节应该依赖于抽象。

      另一种定义方式:针对接口编程,不要针对实现编程。

    2、什么是依赖?

    例子:如果在 Class A 中,有 Class B 的实例,则称 Class A 对 Class B 有一个依赖。例如下面类 Human 中用到一个 Father 对象,我们就说类 Human 对类 Father 有一个依赖。  

    public class Human {

        ...

        Father father;

        ...

        public Human() {

            father = new Father();

        }

    }

    3、如何倒置?

    举个例子,现在你需要实现一个比萨店,你第一件想到的事情是什么?我想到的是一个比萨店,里面有很多具体的比萨,如:芝士比萨、素食比萨、海鲜比萨……
    比萨店是上层模块,比萨是下层模块,如果把比萨店和它依赖的对象画成一张图,看起来是这样:
     
    现在“倒置”你的想法……别从上层模块比萨店开始思考,而是从下层模块比萨开始,然后想想看能抽象化些什么。你可能会想到,芝士比萨、素食比萨、海鲜比萨都是比萨,
    所以它们应该共享一个Pizza接口。你想要抽象化一个Pizza。好,现在回头重新思考如何设计比萨店。

    图一的依赖箭头都是从上往下的,图二的箭头出现了从下往上,依赖关系确实“倒置”了。另外,此例子也很好的解释了“上层模块不应该依赖底层模块,

    它们都应该依赖于抽象。”,在最开始的设计中,高层模块PizzaStroe直接依赖低层模块(各种具体的Pizaa),调整设计后,高层模块和低层模块都依赖于抽象(Pizza)

    4、依赖倒置原则分析

    简单来说,依赖倒转原则就是指:代码要依赖于抽象的类,而不要依赖于具体的类;要针对接口或抽象类编程,而不是针对具体类编程。

                                   
     
    依赖倒转原则的常用实现方式之一是在代码中使用抽象类,而将具体类放在配置文件中。

    类之间的耦合:

      零耦合关系

      具体耦合关系

      抽象耦合关系

    依赖倒转原则要求客户端依赖于抽象耦合,以抽象方式耦合是依赖倒转原则的关键。

    依赖注入:

      构造注入(Constructor Injection):通过构造函数注入实例变量。

      设值注入(Setter Injection):通过Setter方法注入实例变量。

      接口注入(Interface Injection):通过接口方法注入实例变量

    构造注入:

    public class Human {

        ...

        Father father;

        ...

        public Human() {

            father = new Father();

        }

    }

    public class Human {

        ...

        Father father;

        ...

        public Human(Father father) {

            this.father = father;

        }

    }

    public class Human {

        ...

        Father father;

        ...

        public SetFather(Father father) {

            this.father = father;

        }

    }

    上面代码中,我们将 father 对象作为构造函数的一个参数传入。在调用 Human 的构造方法之前外部就已经初始化好了 Father 对象。像这种非自己主动初始化依赖,而通过外部来传入依赖的方式,我们就称为依赖注入。

    现在我们发现上面 1 中存在的两个问题都很好解决了,简单的说依赖注入主要有两个好处:

    (1). 解耦,将依赖之间解耦。

    (2). 因为已经解耦,所以方便做单元测试,尤其是 Mock 测试

    参考博客链接:https://www.jianshu.com/p/c3ce6762257c

     
     
     

      

  • 相关阅读:
    取球问题
    汉字首字母
    上三角
    循环小数
    拓扑排序
    倒水
    equals方法使用技巧
    Java库中的集合
    win10安装Redis方法以及基本配置
    c、c++函数随机
  • 原文地址:https://www.cnblogs.com/leo1111/p/12515916.html
Copyright © 2011-2022 走看看