MST

星途 面试题库

面试题:Java中责任链模式如何处理请求的传递

请简述在Java中实现责任链模式时,请求是如何在各个处理节点之间传递的,并举例说明一个可能的应用场景。
33.0万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

请求传递方式

  1. 定义处理节点接口:在Java中实现责任链模式,首先要定义一个处理请求的接口,该接口包含一个处理请求的方法,通常每个处理节点类都实现这个接口。
  2. 处理节点间的关联:每个处理节点内部持有下一个处理节点的引用。当一个处理节点接收到请求时,它先判断自己是否能处理该请求。如果能处理,就进行处理;如果不能处理,就将请求传递给下一个节点,通过调用下一个节点的处理方法实现传递。例如:
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);
        }
    }
}
  1. 客户端发起请求:客户端创建处理链,并将请求发送给链中的第一个处理节点,之后按照上述规则依次传递请求。

应用场景举例

审批流程:比如请假审批流程。员工提交请假申请(请求),首先由直属上级(第一个处理节点)进行审批。如果请假天数在直属上级的审批权限内,直属上级直接处理;如果超出权限,直属上级将请假申请传递给部门经理(第二个处理节点)。部门经理同样判断是否在自己权限内,若在则处理,否则继续传递给更高层领导,以此类推,直到请求被处理。

// 定义请求类
class Request {
    private RequestType type;

    public Request(RequestType type) {
        this.type = type;
    }

    public RequestType getType() {
        return type;
    }
}

enum RequestType {
    TYPE1, TYPE2
}

在上述请假审批场景中,Request可以是请假申请对象,RequestType可以代表不同类型或天数范围的请假申请,不同的处理节点(直属上级、部门经理等)根据申请类型决定是否处理请求。