依赖倒置原则

1.起源与定义

1.1起源

  依赖倒置原则是Robert C. Martin在1996年为“C++Reporter”所写的专栏Engineering Notebook的第三篇,后来加入到他在2002年出版的经典著作“Agile Software Development, Principles,Parrerns,and Practices”一书中。

                                             

1.2.定义  

  依赖倒转原则(Dependency Inversion Principle, DIP):抽象不应该依赖于细节,细节应当依赖于抽象。换言之,要针对接口编程,而不是针对实现编程。以Java为例,针对接口编程的意思就是说,应当使用Java接口和抽象Java类进行变量的类型声明、参量的类型声明、方法的返还类声明,以及数据类型的转换等。不针对实现编程就是说,不应当使用具体Java类进行变量的类型声明、参数量的类型声明、方法的返还类型声明,以及数据类型的转换等。依赖倒置关系强调一个系统内的实体之间关系的灵活性。

2.依赖倒置的实现

  在实现依赖倒转原则时,我们需要针对抽象层编程,而将具体类的对象通过依赖注入 (DependencyInjection, DI)的方式注入到其他对象中,依赖注入是指当一个对象要与其他对象发 生依赖关系时,通过抽象来注入所依赖的对象。常用的注入方式有三种,分别是:构造注入,设值注入和接口注入这些方法在定义时使用的是抽象类型,在运行时再传入具体类型 的对象,由子类对象来覆盖父类对象。下面我们以一个例子来具体分析。

 

  上面的设计没有使用依赖倒置原则,模块与模块之间耦合度太高,生产力太低,只要需求一变就需要大面积重构,说明这样的设计是不合理。

注:下面所列代码皆以上述图片例子为基础 

2.1构造注入

  构造注入是指通过构造函数来传入具体类的对象。如在上述例子中增加Food类的构造函数。 

 1 public interface IChef{
 2   public void cook();  
 3 }
 4 public class Chef Implements IChef{
 5   private IFood food;  
 6 
 7   public void Chef(IFood food)
 8     {
 9         this.food = food;
10     }  
11     public void cook(IFood food)
12     {
13         this.food.cook();
14     }
15 }

2.2设值注入

  设值注入是指通过Setter方法来传入具体类的对象。如在上述例子中加入food的Setter方法。

 

public interface IChef{
  public void setFood(IFood food);
  public void cook();
}

public class Chef implements IChef{
  private IFood food;

  public void setFood(IFood food){
    this.food = food;
  }

  public void cook(){
    this.food.cook();
  }
}

 

2.3接口注入 

  接口注入是指通过在接口中声明的业务 方法来传入具体类的对象。如在上述例子中将Chef和Food写为接口,具体的厨师和食物通过接口实现。

 

public interface IChef {
     public void cook(IFood food);
}

public class Chef implements IChef{
    public void cook(IFood food){
        food.cook();
    }
}

public interface IFood {
      public void cook();
}

public class Steak implements IFood{
    public void cook(){
        System.out.println("牛排正在制作");
  }
}

public class Noodle implements IFood{
   public void cook(){
      System.out.println("面条正在制作");
   }
}

public class Customer{
     public static void main(String[] args) {
       IChef chef = new Chef();
       IFood steak = new Steak();
       chef.cook(steak);
   }
}

 

 

3.依赖倒置原则的作用

  依赖倒置原则有以下主要作用:(1)依赖倒置原则可以降低类间的耦合性;(2)依赖倒置原则可以提高系统的稳定性;(3)依赖倒置原则可以减少并行开发引起的风险;(4)依赖倒置原则可以提高代码的可读性和可维护性。

 

参考链接:http://c.biancheng.net/view/1326.html

     https://wenku.baidu.com/view/2b48cb6348d7c1c708a14534.html

     https://blog.csdn.net/king123456man/article/details/81626127

     https://www.jianshu.com/p/c3ce6762257c

 

 

posted @ 2020-03-19 11:33  kkkyl  阅读(563)  评论(0)    收藏  举报