面试题答案
一键面试1. 单一职责原则的示例
假设我们有一个处理用户信息的场景。在不遵循单一职责原则时,可能会设计出这样一个类:
public class UserService {
public void saveUser(User user) {
// 连接数据库,执行插入操作保存用户信息
}
public void sendWelcomeEmail(User user) {
// 配置邮件服务器,发送欢迎邮件给用户
}
public void validateUser(User user) {
// 对用户输入的信息进行验证
}
}
在这个类中,UserService
承担了保存用户、发送邮件和验证用户的职责,违反了单一职责原则。
遵循单一职责原则,我们可以将其拆分为三个类:
- 用户保存类:
public class UserSaver {
public void saveUser(User user) {
// 连接数据库,执行插入操作保存用户信息
}
}
- 邮件发送类:
public class EmailSender {
public void sendWelcomeEmail(User user) {
// 配置邮件服务器,发送欢迎邮件给用户
}
}
- 用户验证类:
public class UserValidator {
public void validateUser(User user) {
// 对用户输入的信息进行验证
}
}
2. 遵循单一职责原则对代码维护和扩展的好处
- 代码维护:
- 易于理解:每个类只有一个明确的职责,开发人员在阅读代码时能够快速了解该类的功能。例如,当查看
UserSaver
类时,就知道它只负责保存用户信息,而不用在一个包含多种功能的类中寻找保存用户信息的具体逻辑。 - 便于修改:如果保存用户信息的逻辑发生变化,只需要修改
UserSaver
类,不会影响到EmailSender
和UserValidator
类。这大大降低了修改代码时引入错误的风险。
- 易于理解:每个类只有一个明确的职责,开发人员在阅读代码时能够快速了解该类的功能。例如,当查看
- 代码扩展:
- 提高可扩展性:当需要添加新功能时,例如发送用户注册成功短信,只需要创建一个新的类
SmsSender
,而不需要修改已有的UserSaver
、EmailSender
和UserValidator
类。这样可以更方便地对系统进行功能扩展。 - 增强复用性:每个类职责单一,在其他项目或模块中,如果需要保存用户信息的功能,就可以直接复用
UserSaver
类,而不需要把整个UserService
类(包含多种职责)都引入进来。
- 提高可扩展性:当需要添加新功能时,例如发送用户注册成功短信,只需要创建一个新的类