Skip to content

依赖注入

Mr.wu edited this page Jul 11, 2017 · 3 revisions

什么是依赖注入

在面向对象编程中,我们经常处理处理的问题就是解耦,程序的耦合性越低表明这个程序的可读性以及可维护性越高。控制反转(Inversion of Control或IoC)就是常用的面向对象编程的设计原则,使用这个原则我们可以降低耦合性。其中依赖注入是控制反转最常用的实现。

什么是依赖

依赖是程序中常见的现象,比如类Car中用到了GasEnergy类的实例energy,通常的做法就是在Car类中显式地创建GasEnergy类的实例,并赋值给energy。如下面的代码

interface Energy {
      
}
  
class GasEnergy implements Energy {
      
}
  
class Car {
  Energy energy = new GasEnergy();
}

存在问题

  • 类Car承担了多余的责任,负责energy对象的创建,这必然存在了严重的耦合性。举一个现实中的例子,一辆汽车使用哪种能源不是由汽车来决定,而是由汽车制造商(CarMaker)来决定,这是汽车制造商的责任。

  • 可扩展性,假设我们想修改能源为电动力,那么我们必然要修改Car这个类,明显不符合开放闭合原则。

  • 不利于单元测试。

依赖注入

依赖注入是这样的一种行为,在类Car中不主动创建GasEnergy的对象,而是通过外部传入GasEnergy对象形式来设置依赖。 常用的依赖注入有如下三种方式

构造器注入

将需要的依赖作为构造方法的参数传递完成依赖注入。

class Car {
  Energy mEnergy;
  public Car(Energy energy) {
      mEnergy = energy;
  }
}

Setter方法注入

增加setter方法,参数为需要注入的依赖亦可完成依赖注入。

class Car {
  Energy mEnergy;
      
  public void setEnergy(Energy energy) {
      mEnergy  = energy;
  }
}

接口注入

接口注入,闻其名不言而喻,就是为依赖注入创建一套接口,依赖作为参数传入,通过调用统一的接口完成对具体实现的依赖注入。

interface EnergyConsumerInterface {
  public void setEnergy(Energy energy);
}
  
class Car implements EnergyConsumerInterface {
  Energy mEnergy;
      
  public void setEnergy(Energy energy) {
      mEnergy  = energy;
  }
}

接口注入和setter方法注入类似,不同的是接口注入使用了统一的方法来完成注入,而setter方法注入的方法名称相对比较随意。

来自:http://droidyue.com/blog/2015/06/13/talk-show-about-dependency-injection/

Home

Android 开发录

-深入理解LayoutInflater.inflate()的参数

计算机网络原理

数据库

Java 垃圾回收机制

Java 开发录

面试

搭建翻墙shadowsocks 教程

其他

Clone this wiki locally