
依赖倒置原则(Dependency Inversion Principle, DIP)是面向对象设计五大基本原则之一,由罗伯特·C·马丁(Robert C. Martin)在《敏捷软件开发:原则、模式与实践》一书中提出。
这个原则的核心思想是:
高层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。
这里的“高层模块”和“低层模块”是相对的,可以理解为在软件架构中,调用者(或使用者)和被调用者(或被使用者)的关系。高层模块通常是调用者,而低层模块是被调用者。
假设有一个日志系统,我们有一个Logger接口和一个具体的FileLogger实现类。我们的应用程序(高层模块)依赖于Logger接口而不是FileLogger类。这样,如果我们将来需要添加一个新的日志实现(如DatabaseLogger),我们只需要实现Logger接口,而不需要修改应用程序的代码。
// Logger接口(抽象)
public interface Logger {
void log(String message);
}
// FileLogger实现类(细节)
public class FileLogger implements Logger {
@Override
public void log(String message) {
// 将日志写入文件
}
}
// 应用程序(高层模块)
public class Application {
private Logger logger;
public Application(Logger logger) {
this.logger = logger;
}
public void doSomething() {
// 做一些事情
logger.log("Something happened");
}
}