面向对象之依赖倒置原则

依赖倒置原则(Dependence Inversion Principle)

具体依赖抽象,上层依赖下层。假设B是较A低的模块,但B需要使用到A的功能,这个时候,B不应当直接使用A中的具体类;而应当由B定义一抽象接口,并由A来实现这个抽象接口,B只使用这个抽象接口;这样就达到了依赖倒置的目的,B也解除了对A的依赖,反过来是A依赖于B定义的抽象接口。通过上层模块难以避免依赖下层模块,假如B也直接依赖A的实现,那么就可能造成循环依赖。

采用依赖倒置原则可以减少类间的耦合性,提高系统的稳定性,减少并行开发引起的风险,提高代码的可读性和可维护性。

 

一段代码了解 转自http://my.oschina.net/shyl/blog/530123

<?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();
 
?>

依赖倒置原则核心一句话:面向接口编程。

posted @ 2016-03-07 15:42  wangxusummer  阅读(1054)  评论(0编辑  收藏  举报