依赖注入通俗讲解

(1)不依赖注入的情况

下面这个例子,是不采用依赖注入的紧耦合的写法,在子弹供应商BulletProvider出现的时候,子弹才生产出来,而且生产时类型固定,如果要增加类型,则必须同时对BulletProvider和Bullet进行改造:
子弹生产商是这样干活的,

Class Bullet
{
    “不依赖注入的子弹,独家生产,别无他货”
}

而子弹供应商是这样干活的,

    class BulletProvider{  
        Bullet bullet; 
        BulletProvider {  
            bullet = new Bullet();  
        }  
    }

(2)依赖注入的情况

我们期望,子弹和最终供应商无关,可以由任何子弹生产厂家提供,
//规定子弹必须具有共有属性

Interface BulletModInterface 

{
    Public function bulletinfo()
    {
    }
}

//生产blunt型号的子弹

Class Bluntbullet implements BulletModInterface
{
    Public function bulletinfo()
    {
        “blunt” //个性化生产1
    }
 }

//生产sharp型号的子弹

Class Sharpbullet implements BulletModInterface
{
      Public function bulletinfo()
      {
          “sharp” //个性化生产2
      }
 }

为了防止供应假冒伪劣产品,我们必须限定供应的bullet的属性,并且,子弹的创建,是在供应商之外,可以由任意有能力的生产厂家(比如Sharpbullet或Bluntbullet)提供,于是,我们说供应商依赖生产厂家注入了子弹。

Class BulletProvider
{
  Protected mod;
  Public bullet(BulletModInterface mod)
  {
      this.mod = mod;  //确保必须是BulletModInterface
  }
}

//生产一颗子弹

bluntblt = new Bluntbullet;

//注入一个子弹依赖模组,也就是说,在子弹供应商出现之前,子弹就已经存在了,在供应商出现之后,子弹注入到供应商的仓库里去。

myblt = new  BulletProvider (bluntblt);

当然,程序中一般会这么写

myblt = new  BulletProvider (new Bluntbullet);

结论,传统的思路是,当子弹供应商需要子弹时,如果供应商有制造子弹的方法,就调用这个方法去制造子弹;依赖注入的思想就是,先创建子弹,在创建供应商的时候,把子弹注入进去,目的就是注入更符合自己当时使用所需要要的子弹。

OK,就这样!