依赖注入通俗讲解
依赖注入通俗讲解
(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,就这样!