依赖倒置原则

Posted veda0612

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了依赖倒置原则相关的知识,希望对你有一定的参考价值。

介绍依赖倒置原则的相关概念,建议reading time : 5mins

一、基本定义

依赖倒置原则(Dependence Inversion Principle,简称DIP)的原始定义是:高层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。

Another method of definition: 在Java中的表现是,接口或抽象类不依赖于实现类,即针对接口编程,不要针对实现编程。

二、依赖倒置的三种实现方式

1、通过构造函数传递依赖对象

 比如在构造函数中的需要传递的参数是抽象类或接口的方式实现。

2、通过setter方法传递依赖对象

该依赖的特点是依赖对象和引用对象的生命周期一般不是同步的,也有可能不是必须的。

3、接口声明实现依赖对象。

三、依赖倒置原则的优点

1.可以减少类间的耦合性,将每个类之间的依赖关系降到最低,相互依赖变少了,则系统的稳定性也会提高。

2.有利于代码的扩展和维护,因为只用抽象来表示依赖关系,就可以使用该抽象类型的所有子类。

3.降低并行开发引起的风险。

四、举例说明                                                                                      

  技术图片

                                  图1 司机驾驶奔驰车类

 司机源码为:

public class Driver{

  public void driver(Benz benz){

    benz.run();

  }

}

奔驰车源码为:

public class Benz{

  public void run(){

    System.out.println("奔驰开始运行");

  }

}

场景类源代码,例如满足客户Tom的需求

public class Client{

  public static void main(String[] args){

    Driver Tom = new Driver();

    Benz benz = new Benz();

    Tom.drive(benz);

  }

}

以上只是完成了基本需求,如果出现一个新要求:Tom不仅要开奔驰车,还要开宝马的时候,这个时候有宝马车源码为:

宝马车源码为:

public class BMW{

  public void run(){

    System.out.println("宝马开始运行");

  }

}

此时存在一个问题,虽然宝马车有了,但是客户Tom确没办法开,除非改Driver类的方法,因为司机类和奔驰车类之间是一个紧耦合关系,这里新增加一个车类就要修改driver类,做一些修改,建立两个接口:IDriver 和 ICar ,如下图所示:

技术图片

 

         图2 引入依赖倒置原则后

司机接口:

public interface IDriver{

  public void driver(ICar car);

} 

场景类源代码,依然满足客户Tom开奔驰车的需求,要开宝马车的话,就改变车类就行了。

public class Client{

  public static void main(String[] args){

    IDriver Tom = new Driver();

    ICar benz = new Benz();

    Tom.drive(benz);

  }

}

 

总而言之, 依赖倒置的本质原则就是 :通过抽象(接口或抽象类)使各个类或模块实现彼此独立,互不影响,实现模块间的松耦合。

 

 

            

 

以上是关于依赖倒置原则的主要内容,如果未能解决你的问题,请参考以下文章

依赖倒置原则

依赖倒置原则

依赖倒置原则——面向对象设计原则

依赖倒置原则

手撸golang 架构设计原则 依赖倒置原则

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