使java代码举例说明倒置和不导致的不同
时间: 2024-01-11 15:04:28 浏览: 68
好的,我举一个简单的例子,假设我们有一个 UserService 接口和一个 User 类, UserService 接口定义了一些操作用户的方法,而 User 类则是表示用户对象。
不使用依赖倒置原则的写法:
```java
public class UserServiceImpl {
private UserDao userDao = new UserDao();
public void addUser(User user) {
userDao.save(user);
}
public void deleteUser(int userId) {
userDao.delete(userId);
}
public User getUser(int userId) {
return userDao.get(userId);
}
}
public class UserDao {
public void save(User user) {
// save user to database
}
public void delete(int userId) {
// delete user from database
}
public User get(int userId) {
// get user from database
return null;
}
}
```
在这种写法中,UserService 实现类直接依赖于 UserDao 类,导致 UserService 不能独立于 UserDao 进行测试或者扩展。
使用依赖倒置原则的写法:
```java
public interface UserService {
void addUser(User user);
void deleteUser(int userId);
User getUser(int userId);
}
public class UserServiceImpl implements UserService {
private UserDao userDao;
public UserServiceImpl(UserDao userDao) {
this.userDao = userDao;
}
public void addUser(User user) {
userDao.save(user);
}
public void deleteUser(int userId) {
userDao.delete(userId);
}
public User getUser(int userId) {
return userDao.get(userId);
}
}
public interface UserDao {
void save(User user);
void delete(int userId);
User get(int userId);
}
public class UserDaoImpl implements UserDao {
public void save(User user) {
// save user to database
}
public void delete(int userId) {
// delete user from database
}
public User get(int userId) {
// get user from database
return null;
}
}
```
在这种写法中,UserService 接口和 UserDao 接口相互独立,UserService 实现类通过构造函数依赖于 UserDao 接口的实现类 UserDaoImpl,UserService 可以独立于 UserDao 进行测试和扩展。同时,如果需要更换 UserDao 的实现类,只需要修改 UserServiceImpl 的构造函数即可。
阅读全文