面试题答案
一键面试单一职责原则在Java类设计中的示例
假设我们有一个简单的用户管理系统,涉及用户信息的存储和用户登录功能。如果不遵循单一职责原则,可能会写出如下代码:
public class UserService {
// 存储用户信息
public void saveUser(String username, String password) {
// 实际逻辑可能是将用户信息保存到数据库等持久化存储
System.out.println("Saving user: " + username + " with password: " + password);
}
// 用户登录功能
public boolean login(String username, String password) {
// 实际逻辑可能是验证用户名和密码是否匹配
System.out.println("Attempting to login user: " + username);
return true;
}
}
这样的设计中,UserService
类承担了两个职责:用户信息存储和用户登录验证。
遵循单一职责原则,我们可以将这两个职责分离到不同的类中:
// 用户信息存储服务类
public class UserStorageService {
public void saveUser(String username, String password) {
System.out.println("Saving user: " + username + " with password: " + password);
}
}
// 用户登录服务类
public class UserLoginService {
public boolean login(String username, String password) {
System.out.println("Attempting to login user: " + username);
return true;
}
}
遵循单一职责原则对代码维护和扩展的好处
- 代码维护:
- 可读性增强:每个类的职责明确,代码结构更加清晰。例如在上述例子中,
UserStorageService
只专注于用户信息存储,UserLoginService
只负责用户登录,开发人员一眼就能看出每个类的作用,无需在一个大而杂的类中寻找特定功能的代码。 - 修改风险降低:当需要修改用户信息存储的逻辑时,只需要在
UserStorageService
类中进行修改,而不会影响到UserLoginService
类的功能。如果不遵循单一职责原则,在同一个类中修改存储逻辑可能会不小心破坏登录功能,增加了维护成本和引入错误的风险。
- 可读性增强:每个类的职责明确,代码结构更加清晰。例如在上述例子中,
- 代码扩展:
- 灵活性提高:如果业务需求发生变化,比如需要添加新的用户认证方式,只需要在
UserLoginService
类中进行扩展,而不会影响到UserStorageService
类。同样,如果要改变用户信息的存储方式,也只需对UserStorageService
类进行操作,不会干扰到登录相关的代码。 - 可复用性提升:每个类职责单一,使得这些类更容易在其他项目或模块中复用。例如,在其他需要用户登录功能的项目中,可以直接复用
UserLoginService
类,而无需连同不相关的用户存储功能一起复用。
- 灵活性提高:如果业务需求发生变化,比如需要添加新的用户认证方式,只需要在