10分钟理解依赖注入
看到網絡上很多“依賴注入”解釋的話題,這篇博客呢也只是我自己的觀點,如果你有不同的觀點請拍磚,不用客氣。
業務場景
小明要去旅游,但是還未確定以什么方式出游,有可能是徒步旅行,也有可能是自駕游。
代碼演示
根據步行和駕車的速度來考慮距離旅游目的地的路程,所以這里定義了兩個屬性$speed和$distance。所有有了如下代碼:
interface travelInterface{public function __construct($speed, $distance);public function run(); }abstract class travel implements travelInterface{protected $speed; // 最高時速protected $distance; // 最遠路程public function __construct($speed, $distance){$this->speed = $speed;$this->distance = $distance;}}class drive extends travel{public function run(){echo "自駕游";} }class walk extends travel{public function run(){echo "徒步旅行";} }如果是選擇自駕游
class human {protected $travel; // 出行方式public function __construct(){$this->travel = new drive(60,1000);}public function traveling(){$this->travel->run();} }$xiaoming = new human(); $xiaoming->traveling();
那么,如果需要換一種出行方式的時候,則需要修改human類。這里看起來修改非常簡單,但是我們實際項目中可能會夾雜著很多的業務邏輯一起修改。
就說下依賴注入的基礎方式
class human {protected $travel; // 出行方式public function __construct(travel $travel){$this->travel = $travel;}public function traveling(){$this->travel->run();} }$travel = new drive(60,1000); $xiaoming = new human($travel); $xiaoming->traveling();什么是依賴注入
簡單的說:在A類中使用了B類的實例時,B對象的構造不是在A類某個方法中初始化的,而是在A類外部初始化之后以B類的對象傳入進來。這個過程就是依賴注入。
換一種通過配置文件來實現控制反轉
$config = ["travel" => drive::class, ];$travel = new $config["travel"](60,1000); $xiaoming = new human($travel); $xiaoming->traveling();通過上面的方式,以什么方式旅行,只需要修改配置$config就行。
這在我們PHP里感觸不明顯,覺得修改$config和修改$travel = new drive(60,1000)差別不到,一方面是便于管理,另一方面是PHP的非編譯型的特性優勢。如果用Java來實現,感觸就非常明顯了,比如程序已經打包了,只需要修改配置文件,就可以控制類的依賴關系了。起到了解耦的作用。
雖然很多時候大家一說到控制反轉,依賴注入,就非要和說到反射,我覺得上面IOC只是一種思想,具體的實現方式,在不同的語言中有不同的表現形式。只要將這種依賴關系解耦出來,可以配置化就是IOC的實現了。
原文地址:https://mengkang.net/790.html
總結
以上是生活随笔為你收集整理的10分钟理解依赖注入的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: zabbix系列(四)Zabbix3.0
- 下一篇: Servlet开发(二)