九 DIP 依賴倒置原則
阿新 • • 發佈:2018-08-01
方法 不支持 public 福特 依據 nts nbsp ace ica
首先看定義:
1.高層模塊不依賴於低層模塊,兩者都應該依賴於抽象層
2.抽象不能依賴於細節,細節必須依賴於抽象
首先,模塊是個抽象的概念,可以大到一個系統中的子系統作為一個模塊,也可以是某個子系統中的組件,也可以是某個組件中的某個類。都可以稱為模塊。
先看第一條:
高層依賴於低層模塊:是指高層模塊需要調用低層模塊的方法
再看第二條:
抽象不能依賴於細節:細節必須依賴於抽象,是指低層模塊的方法實現應該是繼承於接口,按照接口定義的抽象方法來實現,而不是接口去按照低層模塊實現的方法來定義接口
最後:
兩者都應該依賴於抽象層是指:高層的模塊調用低層方法的依據是按照抽象層所開放出來的接口去調用,而不是抽象層下面具體的方法實現來調用。低層的模塊應該去繼承或者去實現抽象層的定義的抽象方法。
舉例:
<?php /** * 駕駛員類 */ class Player { //這裏定義了兩個相同的方法名,不同參數的方法。這個在java中屬於重載,但是PHP中的重載是指的動態的“創建”屬性和方法,因此這裏只是為了方便理解,PHP並不支持這種重載方式。 /** * 駕駛福特 * 不好的依賴,Player類的driver方法直接使用了Ford類中的run和stop方法 */ public function driver(Ford $car) {$car->run();//前進 $car->stop();//停止 } /** * 駕駛奔馳 * 不好的依賴,同上 */ public function driver(Benz $car) { $car->run(); $car->stop(); } } class Ford { public function run() {echo ‘biu~~‘; } public function stop() { echo ‘duang‘; } } class Benz { public function run() { echo ‘biu~~‘; } public function stop() { echo ‘duang‘; } }
從上面看,Player的兩個駕駛方法都是直接使用了具體的類,如果某個類的方法發生了改變,例如類名發生了改變。那麽Player類也要做相應的修改。
良好的依賴:
<?php /** * 駕駛員類 */ class Player { //fixme 這裏定義了兩個相同的方法名,不同參數的方法。這個在java中屬於重載,但是PHP中的重載是指的動態的“創建”屬性和方法,因此這裏只是為了方便理解,PHP並不支持這種重載方式。 /** * 駕駛福特 * 依賴的是ICar接口,Player類不需要知道$car對象是Ford還是Benz,只要知道這兩個品牌的車都實現了ICar接口即可 */ public function driver(ICar $car) { $car->run();//前進 $car->stop();//停止 } /** * 駕駛奔馳 * 不好的依賴,同上 */ public function driver(ICar $car) { $car->run(); $car->stop(); } }
interface Icar { public function run(); public function stop(); }
class Ford implements ICar { public function run() { echo ‘biu~~‘; } public function stop() { echo ‘duang‘; } } class Benz implements ICar { public function run() { echo ‘biu~~‘; } public function stop() { echo ‘duang‘; } }
九 DIP 依賴倒置原則