面向对象之依赖倒置原则

依赖倒置原则(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 @   wangxusummer  阅读(1055)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示