天天看點

控制反轉、依賴注入

第一章:小明和他的手機

從前有個人叫小明

小明有三大愛好,抽煙,喝酒…… 咳咳,不好意思,走錯片場了。應該是逛知乎、玩王者農藥和搶微信紅包

小明的三大愛好

我們用一段簡單的僞代碼,來制造一個這樣的小明

class Ming extends Person

{

private $_name;

private $_age;

function read()
{
    //逛知乎
}

function  play()
{
    //玩農藥
}

function  grab()
{
    //搶紅包
}      

}

但是,小明作為一個人類,沒有辦法僅靠自己就能實作以上的功能,他必須依賴一部手機,是以他買了一台iphone6,接下來我們來制造一個iphone6

class iPhone6 extends Iphone

{

function read($user=“某人”)

{

echo $user.“打開了知乎然後編了一個故事 \n”;

}

function play($user="某人")
{
    echo $user."打開了王者農藥并送起了人頭 \n";
}

function grab($user="某人")
{
    echo $user."開始搶紅包卻隻搶不發 \n";
}      

}

小明非常珍惜自己的新手機,每天把它牢牢控制在手心裡,是以小明變成了這個樣子

class Ming extends Person

{

private $_name;

private $_age;

public function  __construct()
{
    $this->_name = '小明';
    $this->_age = 26;
}

function read()
{
    //……  省略若幹代碼
    (new iPhone6())->read($this->_name); //逛知乎
}

function  play()
{
    //……  省略若幹代碼
    (new iPhone6())->play($this->_name);//玩農藥

}

function  grab()
{
    //……  省略若幹代碼
    (new iPhone6())->grab($this->_name);//搶紅包

}      

}

今天是周六,小明不用上班,于是他起床,并依次逛起了知乎,玩王者農藥,并搶了個紅包。

$ming = new Ming(); //小明起床

$ming->read();

$ming->play();

$ming->grab();

這個時候,我們可以在指令行裡看到輸出如下

小明打開了知乎然後編了一個故事

小明打開了王者農藥并送起了人頭

小明開始搶紅包卻隻搶不發

這一天,小明過得很充實,他覺得自己是世界上最幸福的人。

第二章: 小明的快樂與憂傷

小明和他的手機曾一起度過了一段美好的時光,一到空閑時刻,他就抱着手機,逛知乎,刷微網誌,玩遊戲,他覺得自己根本不需要女朋友,隻要有手機在身邊,就滿足了。

可誰能想到,一次次地系統更新徹底打碎了他的夢想,他的手機變得越來越卡頓,電池的使用壽命也越來越短,一直到某一天的寒風中,他的手機終于耐不住寒冷,頭也不回地關了機。

小明很憂傷,他意識到,自己要換手機了。

為了能獲得更好的使用體驗,小明一咬牙,剁手了一台iphoneX,這部手機鈴聲很大,電量很足,還能雙卡雙待,小明很喜歡,但是他遇到一個問題,就是他之前過度依賴了原來那一部iPhone6,他們之間已經深深耦合在一起了,如果要換手機,他就要拿起刀來改造自己,把自己體内所有方法中的iphone6 都換成 iphoneX。

漫長的改造過程

經曆了漫長的改造過程,小明終于把代碼中的 iphone6 全部換成了 iphoneX。雖然很辛苦,但是小明覺得他是快樂的。

于是小明開開心心地帶着手機去上班了,并在回來的路上被小偷偷走了。為了應急,小明隻好重新使用那部剛剛被遺棄的iphone6,但是一想到那漫長的改造過程,小明的心裡就說不出的委屈,他覺得自己過于依賴手機了,為什麼每次手機出什麼問題他都要去改造他自己,這不僅僅是過度耦合,簡直是本末倒置,他向天空大喊,我不要再控制我的手機了。

天空中的造物主,也就是作為程式員的我,聽到了他的呐喊,我告訴他,你不用再控制你的手機了,交給我來管理,把控制權交給我。這就叫做控制反轉。

第三章:造物主的智慧

小明聽到了我的話,他既高興,又有一點害怕,他跪下來磕了幾個頭,虔誠地說到:“原來您就是傳說中的造物主,巴格梅克上神。我聽到您剛剛說了 控制反轉 四個字,就是把手機的控制權從我的手裡交給你,但這隻是您的想法,是一種思想罷了,要用什麼辦法才能實作控制反轉,又可以讓我繼續使用手機呢?”

“呵“,身為造物主的我在表現完不屑以後,扔下了四個大字,“依賴注入!”

接下來,偉大的我開始對小明進行慘無人道的改造,如下

class Ming extends Person

{

private $_name;

private $_age;

private $_phone; //将手機作為自己的成員變量

public function  __construct($phone)
{
    $this->_name = '小明';
    $this->_age = 26;
    $this->_phone = $phone;
    echo "小明起床了 \n";
}

function read()
{
    //……  省略若幹代碼
    $this->_phone->read($this->_name); //逛知乎
}

function  play()
{
    //……  省略若幹代碼
    $this->_phone->play($this->_name);//玩農藥

}

function  grab()
{
    //……  省略若幹代碼
    $this->_phone->grab($this->_name);//搶紅包

}      

}

接下來,我們來模拟運作小明的一天

phone->isBroken()){//如果iphone不可用,則使用舊版手機

$phone = new Iphone6();

}

phone);//小明不用關心是什麼手機,他隻要玩就行了。

$ming->read();

$ming->play();

$ming->grab();

我們先看一下iphoneX 是否可以使用,如果不可以使用,則直接換成iphone6,然後喚醒小明,并把手機塞到他的手裡,換句話說,把他所依賴的手機直接注入到他的身上,他不需要關心自己拿的是什麼手機,他隻要直接使用就可以了。

這就是依賴注入。

第四章:小明的感悟

小明的生活開始變得簡單了起來,而他把省出來的時間都用來寫筆記了,他在筆記本上這樣寫到