一、设计模式依赖倒置原则定义
高层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象。其核心思想是:要面向接口编程,不要面向实现编程。
依赖倒置原则是实现开闭原则的重要途径之一,它降低了客户与实现模块之间的耦合。
细节具有多变性,而抽象层则相对稳定,因此以抽象为基础搭建起来的架构要比以细节为基础搭建起来的架构要稳定得多。这里的抽象指的是接口或者抽象类,而细节是指具体的实现类。
使用接口或者抽象类的目的是制定好规范和契约,而不去涉及任何具体的操作,把展现细节的任务交给它们的实现类去完成。
二 、原则作用
- 依赖倒置原则可以降低类间的耦合性。
- 依赖倒置原则可以提高系统的稳定性。
- 依赖倒置原则可以减少并行开发引起的风险。
- 依赖倒置原则可以提高代码的可读性和可维护性。
三、原则实现实例
依赖倒置原则的目的是通过要面向接口的编程来降低类间的耦合性,在项目中满足如下规则即可。
- 每个类尽量提供接口或抽象类,或者两者都具备。
- 变量的声明类型尽量是接口或者是抽象类。
- 任何类都不应该从具体类派生。
- 使用继承时尽量遵循里氏替换原则。
1、新建main.java空白文件,cursor输入指令
2、自动生成代码以及文件
2.1、Main.java代码如下:
public class Main {
public static void main(String[] args) {
Logger logger = new FileLogger("user_registration.log");
UserService userService = new UserService(logger);
userService.registerUser("Alice");
}
}
2.2、定义抽象接口Logger.java代码如下:
定义一个日志记录器的抽象接口
public interface Logger {
void log(String message);
}
2.3、实现具体的日志记录器ConsoleLogger.java代码如下:
接下来,我们实现一个具体的日志记录器,例如控制台日志记录器
public class ConsoleLogger implements Logger {
@Override
public void log(String message) {
System.out.println("ConsoleLogger: " + message);
}
}
2.4、修改用户服务以依赖于抽象接口UserService.java代码如下:
public class UserService {
private final Logger logger;
public UserService(Logger logger) {
this.logger = logger;
}
public void registerUser(String username) {
// 用户注册逻辑
logger.log("User " + username + " has been registered.");
}
}
2.5、在主程序中使用依赖注入
最后,我们在主程序中通过依赖注入来提供具体的日志记录器实现。
3、运行主程序输出
user_registration.log日志文件出现如下内容:
FileLogger: User Alice has been registered.
这样你就可以确认日志记录器的功能是否正常工作了。
通过这个例子,我们实现了依赖倒置原则,使得高层模块(UserService)不再依赖于低层模块(ConsoleLogger),而是依赖于抽象(Logger)。这样,如果我们以后需要更换日志记录器的实现,例如使用文件日志记录器,只需要实现新的日志记录器类并注入到UserService中即可,而不需要修改UserService的代码。