面试题答案
一键面试请求传递方式
- 定义处理节点接口:在Java中实现责任链模式,首先要定义一个处理请求的接口,该接口包含一个处理请求的方法,通常每个处理节点类都实现这个接口。
- 处理节点间的关联:每个处理节点内部持有下一个处理节点的引用。当一个处理节点接收到请求时,它先判断自己是否能处理该请求。如果能处理,就进行处理;如果不能处理,就将请求传递给下一个节点,通过调用下一个节点的处理方法实现传递。例如:
public abstract class Handler {
protected Handler successor;
public void setSuccessor(Handler successor) {
this.successor = successor;
}
public abstract void handleRequest(Request request);
}
public class ConcreteHandler1 extends Handler {
@Override
public void handleRequest(Request request) {
if (request.getType() == RequestType.TYPE1) {
System.out.println("ConcreteHandler1 处理请求");
} else if (successor != null) {
successor.handleRequest(request);
}
}
}
public class ConcreteHandler2 extends Handler {
@Override
public void handleRequest(Request request) {
if (request.getType() == RequestType.TYPE2) {
System.out.println("ConcreteHandler2 处理请求");
} else if (successor != null) {
successor.handleRequest(request);
}
}
}
- 客户端发起请求:客户端创建处理链,并将请求发送给链中的第一个处理节点,之后按照上述规则依次传递请求。
应用场景举例
审批流程:比如请假审批流程。员工提交请假申请(请求),首先由直属上级(第一个处理节点)进行审批。如果请假天数在直属上级的审批权限内,直属上级直接处理;如果超出权限,直属上级将请假申请传递给部门经理(第二个处理节点)。部门经理同样判断是否在自己权限内,若在则处理,否则继续传递给更高层领导,以此类推,直到请求被处理。
// 定义请求类
class Request {
private RequestType type;
public Request(RequestType type) {
this.type = type;
}
public RequestType getType() {
return type;
}
}
enum RequestType {
TYPE1, TYPE2
}
在上述请假审批场景中,Request
可以是请假申请对象,RequestType
可以代表不同类型或天数范围的请假申请,不同的处理节点(直属上级、部门经理等)根据申请类型决定是否处理请求。