面试题答案
一键面试违反单一职责原则带来的问题
- 可维护性差:当需要修改用户登录逻辑时,可能会不小心影响到订单创建或日志记录功能,因为它们都集中在同一个类中,牵一发而动全身。
- 可扩展性低:如果要新增一种请求处理逻辑,比如处理商品查询请求,将不得不修改这个已经很臃肿的类,增加了代码修改的风险。
- 复用性差:处理用户登录、订单创建和日志记录的代码紧密耦合在一起,无法单独复用其中某一个功能模块。
重构方法
- 拆分Servlet功能:
- 用户登录Servlet:创建一个新的
LoginServlet
类,专门处理用户登录请求的逻辑,如验证用户名和密码,生成登录令牌等。示例代码如下:
- 用户登录Servlet:创建一个新的
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
// 处理用户登录逻辑
String username = request.getParameter("username");
String password = request.getParameter("password");
// 验证逻辑
if ("admin".equals(username) && "123456".equals(password)) {
response.getWriter().println("登录成功");
} else {
response.getWriter().println("登录失败");
}
}
}
- **订单创建Servlet**:创建`OrderCreateServlet`类,负责处理订单创建的请求,包括接收订单信息,调用业务逻辑进行订单保存等。示例代码如下:
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/createOrder")
public class OrderCreateServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
// 处理订单创建逻辑
String orderInfo = request.getParameter("orderInfo");
// 调用业务逻辑保存订单
response.getWriter().println("订单创建成功,订单信息:" + orderInfo);
}
}
- **日志记录类**:创建一个独立的日志记录类`LoggerUtil`,提供静态方法来记录日志。示例代码如下:
public class LoggerUtil {
public static void log(String message) {
System.out.println("[LOG] " + message);
}
}
- 在Servlet中调用日志记录:在
LoginServlet
和OrderCreateServlet
中,当需要记录日志时,调用LoggerUtil
的方法。例如在LoginServlet
中:
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
// 处理用户登录逻辑
String username = request.getParameter("username");
String password = request.getParameter("password");
// 验证逻辑
if ("admin".equals(username) && "123456".equals(password)) {
LoggerUtil.log("用户 " + username + " 登录成功");
response.getWriter().println("登录成功");
} else {
LoggerUtil.log("用户 " + username + " 登录失败");
response.getWriter().println("登录失败");
}
}
}
通过这样的重构,每个类都只负责单一的职责,提高了代码的可维护性、可扩展性和复用性。