责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,它将请求的发送者和接收者解耦,使得多个对象都有机会处理请求,而不是指定特定的接收者。在责任链中,每个对象都是一个处理者,对请求进行判断或处理,并且可以将请求传递给链中的下一个处理者。
原理
- 抽象处理者(Handler): 定义了一个处理请求的接口,包含了一个方法来处理请求以及一个指向下一个处理者的引用。
- 具体处理者(Concrete Handler): 是抽象处理者的子类,实现请求处理的方法。如果能够处理该请求,则对其进行处理;否则,通过调用下一个处理者的方法将请求传递下去。
- 客户端(Client): 创建责任链并提交请求到链上的第一个处理者。
Java代码示例
// 抽象处理者
public abstract class Handler {protected Handler nextHandler;public void setNext(Handler handler) {this.nextHandler = handler;}// 处理请求的方法public abstract void handleRequest(int request);
}// 具体处理者A
public class ConcreteHandlerA extends Handler {@Overridepublic void handleRequest(int request) {if (request < 10) {System.out.println("ConcreteHandlerA handled the request: " + request);} else if (nextHandler != null) {nextHandler.handleRequest(request);} else {System.out.println("Request not handled");}}
}// 具体处理者B
public class ConcreteHandlerB extends Handler {@Overridepublic void handleRequest(int request) {if (request >= 10 && request < 20) {System.out.println("ConcreteHandlerB handled the request: " + request);} else if (nextHandler != null) {nextHandler.handleRequest(request);} else {System.out.println("Request not handled");}}
}// 客户端使用示例
public class Client {public static void main(String[] args) {Handler handlerA = new ConcreteHandlerA();Handler handlerB = new ConcreteHandlerB();// 构建责任链handlerA.setNext(handlerB);// 提交请求handlerA.handleRequest(5); // ConcreteHandlerA handles it.handlerA.handleRequest(15); // ConcreteHandlerB handles it.handlerA.handleRequest(25); // No one handles it.}
}
想象你正在为一家公司构建一个请假申请审批系统。部门经理、人事主管和CEO都可以审批员工的请假申请。当员工提交申请时,它首先到达部门经理处,如果经理有权批准这个天数的假期则直接处理,否则把申请转交给人事主管,以此类推。在这个例子中,部门经理、人事主管和CEO就形成了一个“责任链”,每个环节都是一个处理者,他们按照一定的顺序处理请求,直到找到合适的审批者为止。
应用
- 权限系统:不同级别的用户具有不同的权限,请求经过多个角色检查,直到找到有权处理的角色为止。
- 日志记录器:按级别过滤日志,低级别的处理器不能处理的消息会自动传递给高级别的处理器。
- 企业审批流程:每一级审批人是一个处理者,根据规则逐级审批或者转交下一级审批。
适用性
- 请求处理者顺序不确定或动态可变的情况。
- 一个请求可能由多个对象中的任意一个对象处理,并且希望简化客户端代码,使其不必明确指定处理请求的对象。
- 需要避免请求发送者与接收者之间的紧耦合,使得系统易于扩展。