MST
星途 面试题库

面试题:Java里依赖倒置原则(DIP)的深度理解与实现

在一个Java的企业级应用开发中,存在业务逻辑层和数据访问层。请基于依赖倒置原则,设计这两层之间的交互方式,并用代码示例说明如何通过接口和依赖注入来实现高层模块不依赖于低层模块,而是依赖于抽象。同时阐述如果不遵循该原则可能出现的问题。
28.3万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

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也需要修改,违背了开闭原则。
  • 可维护性差:高层模块依赖低层模块具体实现,使得代码难以理解和维护,特别是在大型项目中,一处修改可能导致多处连锁反应。
  • 可测试性差:难以对业务逻辑层进行单元测试,因为测试时需要依赖具体的数据访问层实现,可能会引入数据库等外部依赖,增加测试复杂度。