如何理解依赖注入(DI)

什么是依赖注入(Dependency Injection)

  • 依赖倒置原则:高层模块不该该依赖于低层模块,两个都应该依赖于抽象(接口)。
  • 依赖倒置是一种软件设计思想,在传统软件中,上层代码依赖于下层代码,当下层代码有所改动时,上层代码也要相应进行改动,所以维护成本较高。而依赖倒置原则的思想是,上层不该该依赖下层,应依赖接口。意为上层代码定义接口,下层代码实现该接口,从而使得下层依赖于上层接口,下降耦合度,提升系统弹性。

举个栗子:小霸王游戏机

// 若是使用单纯的面向对象来写
class XiaoBaWang
{    
    private $game;    
    public function loadGame()
    {        
    $this->game = new HunDouLuo();        
    $this->game->play();    
    }
}
class HunDouLuo{    
    public function play()    
    {        
    //玩游戏    
    }
}
$machine = new XiaoBaWang();
$machine->loadGame();

class XiaoBaWang
{    
    private $game;    
    public function loadGame()    
    {        
    $this->game = new Tank();       
     $this->game->play();    
}
}
class Tank 
{    
    public function play()    
    {        
        //玩游戏    
    }
}
$reg = new XiaoBaWang();
$reg->loadGame();

使用依赖注入的写法

小霸王游戏机:插拔式卡带网络

interface Game
{    
    public function play();
}
class HunDouLuo implements Game
{    
    public function play()    
{        
// 玩魂斗罗    
}
}
class Tank implements Game
{    
    public function play()    
{        
// 坦克大战    
}
}
class XiaoBaWang
{    
    private $game;    
    public function __construct(Game $game)    
    {        
        $this->game = $game;    
    }    
    public function loadGame()    
    {        
        $this->game->play();    
    }
}
$hunDouLuo = new HunDouLuo();
$tank = new Tank();
$machine = new XiaoBaWang($hunDouLuo);
$machine->loadGame();
$machine = new XiaoBaWang($tank);
$machine->loadGame();
上例就使用了"注入"这个思想,就像注射器同样将一个类的实例注入到另外一个类的实例中去,须要用什么就注入什么。固然"依赖倒置原则"也始终贯彻在里面。"注入"不只能够经过构造函数注入,也能够经过属性注入,上面你能够能够经过一个"set"来动态为"game"这个属性赋值。

ioc容器

不过开发中会有这样的经历,一开始类比较少,慢慢的功能愈来愈多,人员愈来愈多,编写了不少类,要使用这个类必须先引入那个类,并且必定要确保顺序正确。
因而。。。。
就出现了这样的状况, “a 依赖于b, b 依赖于c, c 依赖于 d, d 依赖于e”, 要获取‘a’的实例,你必须依次引入 ‘e,d,c,b’而后依次进行实例化。维护成本上升,开发成本上升,你们都是接盘侠。

再举一个栗子:游戏平台steam/battle

若是没有游戏平台,几个好友想要联机打魔兽争霸,咱们过去是怎么作的?
1.每一个人首先一块儿下载相同版本的游戏
2.安装驱动程序
3.创建/进入 局域互联网络
4.关闭防火墙
5.建房间,进入房间,开始游戏
若是咱们玩了一段时间,想换星际争霸玩,那咱们须要再来一次以上步骤。
最终,咱们玩游戏这个动做是依赖于前面不少步骤的,若是有一步出了错,那么久不能正常开始游戏。

Steam/battle游戏平台作了什么?

当咱们在游戏平台上面要一块儿玩一款游戏时,咱们只须要:
1.下载安装游戏平台
2.选择一款游戏使用平台一键安装
3.开始游戏
这时,若是咱们要换一款游戏,只须要换个游戏平台一键安装,而后开始游戏,不须要担忧和理会以前安装的游戏和开始游戏流程对新游戏有什么影响。

有了以上的思路,咱们就能够建一个steam类和游戏类了...函数

相关文章
相关标签/搜索