MST

星途 面试题库

面试题:Java中单一职责原则(SRP)的应用场景

请举例说明在Java项目中,如何运用单一职责原则来设计一个类,使其职责清晰,并且说明遵循该原则对代码维护和扩展的好处。
36.7万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

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类,不会影响到EmailSenderUserValidator类。这大大降低了修改代码时引入错误的风险。
  • 代码扩展
    • 提高可扩展性:当需要添加新功能时,例如发送用户注册成功短信,只需要创建一个新的类SmsSender,而不需要修改已有的UserSaverEmailSenderUserValidator类。这样可以更方便地对系统进行功能扩展。
    • 增强复用性:每个类职责单一,在其他项目或模块中,如果需要保存用户信息的功能,就可以直接复用UserSaver类,而不需要把整个UserService类(包含多种职责)都引入进来。