Skip to content
快速预览

依赖倒置原则(DIP)

✍️ w 🕒 2023-07-23 12:23:51(10 months ago) 🔗 G.设计模式

依赖反转原则(DIP)是一种面向对象设计原则。依赖反转原则的英文翻译是 Dependency Inversion Principle,缩写为 DIP。中文翻译有时候也叫依赖倒置原则。高层模块(high-level modules)不要依赖低层模块(low-level)。高层模块和低层模块应该通过抽象(abstractions)来互相依赖。除此之外,抽象(abstractions)不要依赖具体实现细节(details),具体实现细节(details)依赖抽象(abstractions)。

在通俗说法高层模块不应该依赖低层模块,二者都应该依赖其抽象,抽象不应该依赖细节,细节应该依赖抽象。这个原则的目的是减少模块之间的耦合,提高代码的可维护性和可扩展性。在实践中,可以通过使用接口或抽象类来实现依赖倒置原则,依赖倒置原则的核心思想是0面向接口编程比相对于面向实现编程好

代码

假设我们有一个Person类,这个类有一个read方法,用来读取一本书的内容。如果不使用依赖倒置原则,我们可能会这样写代码

java
class Book {
    public String getContent() {
        return "很好的一本书";
    }
}

class Person {
    public void read(Book book) {
        System.out.println(book.getContent());
    }
}

这段代码的问题在于,Person类直接依赖了Book类。如果未来我们想让Person类读取其他类型的内容,比如一个电子书或者一个网页,我们就需要修改Person类的代码。

但是,如果我们使用依赖倒置原则,我们可以先定义一个抽象的Readable接口,然后让Book类实现这个接口:

java
interface Readable {
    String getContent();
}

class Book implements Readable {
    public String getContent() {
        return "很好的一本书";
    }
}

class Person {
    public void read(Readable readable) {
        System.out.println(readable.getContent());
    }
}

这样,无论未来我们的内容是一本书,一个电子书,还是一个网页,只要它们实现了Readable接口,Person类就可以读取它们的内容,而不需要做任何修改。这就是依赖倒置原则的作用。

总结

依赖倒置原则其实就是说,我们在编程的时候,应该让上层代码依赖下层代码的抽象概念,而不是依赖下层代码的具体实现。

举个例子,假设你在设计一个电脑系统,这个系统有一个“播放音乐”的功能。在没有使用依赖倒置原则的情况下,你可能会直接编写一段代码,让电脑通过某种特定的音箱来播放音乐。这就是上层代码(电脑系统)直接依赖了下层代码(特定音箱)的具体实现。

但是,如果我们按照依赖倒置原则来做,我们会先定义一个抽象的“音箱”接口,然后让电脑系统通过这个接口来播放音乐,具体使用哪种音箱,就由用户来决定。这样,无论未来音箱的技术怎么发展,只要它们都符合我们定义的“音箱”接口,我们的电脑系统都可以使用,不需要做任何修改。

所以,依赖倒置原则的核心思想就是:面向接口编程,而不是面向实现编程。这样可以让我们的代码更加灵活,更容易适应未来的变化。

参考

反转原则:如何减少代码间的相互影响?

依赖倒置原则DIP

理论五:控制反转、依赖反转、依赖注入,这三者有何区别和联系?

Released under the MIT License.