1. 基于依赖倒置原则设计交互方式及代码示例
public interface UserDao {
void saveUser(String user);
}
public class UserDaoImpl implements UserDao {
@Override
public void saveUser(String user) {
System.out.println("Saving user: " + user);
}
}
public interface UserService {
void registerUser(String user);
}
public class UserServiceImpl implements UserService {
private UserDao userDao;
// 构造函数注入
public UserServiceImpl(UserDao userDao) {
this.userDao = userDao;
}
@Override
public void registerUser(String user) {
System.out.println("Registering user...");
userDao.saveUser(user);
}
}
public class Main {
public static void main(String[] args) {
UserDao userDao = new UserDaoImpl();
UserService userService = new UserServiceImpl(userDao);
userService.registerUser("John Doe");
}
}
2. 不遵循依赖倒置原则可能出现的问题
- 耦合度高:如果业务逻辑层直接依赖具体的数据访问层实现类,比如
UserServiceImpl
直接创建UserDaoImpl
实例,当UserDaoImpl
的实现发生变化,比如数据库连接方式改变,UserServiceImpl
也需要修改,违背了开闭原则。
- 可维护性差:高层模块依赖低层模块具体实现,使得代码难以理解和维护,特别是在大型项目中,一处修改可能导致多处连锁反应。
- 可测试性差:难以对业务逻辑层进行单元测试,因为测试时需要依赖具体的数据访问层实现,可能会引入数据库等外部依赖,增加测试复杂度。