依賴倒置原則(Dependence Inversion Principle)
具體依賴抽象,上層依賴下層。假設B是較A低的模塊,但B需要使用到A的功能,這個時候,B不應當直接使用A中的具體類;而應當由B定義一抽象接口,並由A來實現這個抽象接口,B只使用這個抽象接口;這樣就達到了依賴倒置的目的,B也解除了對A的依賴,反過來是A依賴於B定義的抽象接口。通過上層模塊難以避免依賴下層模塊,假如B也直接依賴A的實現,那麼就可能造成循環依賴。
采用依賴倒置原則可以減少類間的耦合性,提高系統的穩定性,減少並行開發引起的風險,提高代碼的可讀性和可維護性。
一段代碼了解
<?php // 司機開奔馳,未用依賴倒置原則的寫法 class Benz{ public function run(){ return " Benz is runing!!!"; } } class Driver{ public function drive(Benz $car){ echo $car -> run(); } } class Client{ public static function doing(){ $driver = new Driver(); $driver -> drive( new Benz() ); } } Client :: doing(); // 那麼如果司機想開寶馬呢?,是不是就要修改Driver了,這就違反了開閉原則了,怎麼能只在Client添加代碼就讓寶馬車也會開呢? interface ICar{ //定義一個汽車接口 public function run(); } class BMW implements ICar{ public function run(){ return "BMW is runing !!!"; } } class Benz implements ICar{ public function run(){ return "Benz is runing !!!"; } } interface IDriver{ //定義一個司機接口,以防以後有A照,B照,C照的 public function drive(ICar $car); } class Driver implements IDriver{ public function drive(ICar $car){ echo "<br>" . $car -> run(); } } class Client{ public static function doing(){ $driver = new Driver(); $driver -> drive( new BMW() ); //開寶馬 $driver -> drive( new Benz() ); //開奔馳 . . . . } } Client :: doing(); ?>
依賴倒置原則核心一句話:面向接口編程。