如何理解依賴注入(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類和遊戲類了...函數

相關文章
相關標籤/搜索