依赖倒转原则详解(定义特点及思想例子)

依赖倒转原则详解(定义特点及思想例子)-mikechen

依赖倒转原则是常见的系统设计原则,编码也经常使用到,下面详解依赖倒转原则的特点及例子@mikechen

什么是依赖倒转原则

依赖倒转原则,全称是Dependency Inversion Principle,简称DIP,是面向对象设计中的一项重要原则。

 

依赖倒转原则特点

依赖倒转原则特点包括以下几点:

1.将依赖关系转换为对抽象的依赖

依赖倒转原则的核心思想是,高层模块不应该依赖于底层模块,而是应该依赖于抽象,这样可以降低模块之间的耦合度。

2.抽象不应该依赖于具体实现

依赖倒转原则指出具体实现应该依赖于抽象,而不是抽象依赖于具体实现,这样可以使得代码更具有可扩展性和可重用性。

3.实现方式灵活多样

在实际编程中,可以采用接口、抽象类、依赖注入等技术来实现依赖倒转原则,使得代码更加灵活和可扩展。

4.便于维护和重构

依赖倒转原则可以减少模块之间的耦合度,使得代码更容易维护和重构。

 

依赖倒转原则核心

依赖倒转原则核心思想是将高层模块与低层模块之间的依赖关系反转过来,使得高层模块不再直接依赖于低层模块,而是依赖于抽象接口。

体而言,该原则的核心思想包含以下两个方面:

1.高层模块不应该依赖于低层模块,而是应该依赖于抽象接口。

在传统的面向对象设计中,通常会将一个系统划分为多个层次,每个层次都依赖于下一层次的模块,从而形成了一条层次化的依赖链。

这种依赖关系会导致代码的耦合性很高,不利于代码的扩展和维护。

依赖倒转原则的核心思想是将这种依赖关系反转过来,即高层模块依赖于抽象接口,而不是依赖于具体的低层模块。

2.抽象接口不应该依赖于具体实现

依赖倒转原则还强调了抽象接口与具体实现之间的关系,指出具体实现应该依赖于抽象接口,而不是抽象接口依赖于具体实现。

这样可以使得代码更加灵活和可扩展,具体实现可以被替换或扩展,而不会影响高层模块的使用。

 

依赖倒转原则例子

以下是一个简单的例子,演示了如何使用依赖倒转原则来减少模块之间的耦合。

假设有一个电视机类(TV)和一个遥控器类(RemoteControl),遥控器类依赖于电视机类,通过调用电视机类的方法来控制电视机。

代码如下:

public class TV {
    public void turnOn() {
        System.out.println("Turn on the TV.");
    }
    
    public void turnOff() {
        System.out.println("Turn off the TV.");
    }
}

public class RemoteControl {
    private TV tv;
    
    public RemoteControl() {
        tv = new TV();
    }
    
    public void turnOnTV() {
        tv.turnOn();
    }
    
    public void turnOffTV() {
        tv.turnOff();
    }
}

这个实现看起来很简单,但是存在一个问题:遥控器类和电视机类之间的依赖关系非常紧密,遥控器类依赖于具体的电视机类。

如果需要更换或扩展电视机类,就需要修改遥控器类的代码,从而增加了模块之间的耦合性。

为了遵循依赖倒转原则,我们可以引入一个抽象接口(TVDevice),遥控器类不再直接依赖于具体的电视机类,而是依赖于抽象接口。

代码如下:

public interface TVDevice {
    void turnOn();
    void turnOff();
}

public class TV implements TVDevice {
    public void turnOn() {
        System.out.println("Turn on the TV.");
    }
    
    public void turnOff() {
        System.out.println("Turn off the TV.");
    }
}

public class RemoteControl {
    private TVDevice tv;
    
    public RemoteControl(TVDevice tv) {
        this.tv = tv;
    }
    
    public void turnOnTV() {
        tv.turnOn();
    }
    
    public void turnOffTV() {
        tv.turnOff();
    }
}

遥控器类不再依赖于具体的电视机类,而是依赖于抽象接口TVDevice。

同时,电视机类实现了抽象接口,从而依赖于抽象接口。

这样可以减少模块之间的耦合性,提高代码的灵活性和可维护性。

 

作者简介

陈睿|mikechen,10年+大厂架构经验,BAT资深面试官,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

👇阅读更多mikechen架构文章👇

阿里架构 |双11秒杀 |分布式架构 |负载均衡 |单点登录 |微服务 |云原生 |高并发 |架构师

以上

关注作者「mikechen」公众号,获取更多技术干货!

后台回复架构,即可获取《阿里架构师进阶专题全部合集》,后台回复面试即可获取《史上最全阿里Java面试题总结

评论交流
    说说你的看法