责任链模式(Chain of Responsibility Pattern)
1. 概念
责任链模式是一种行为设计模式,它允许将请求沿着处理者链传递,直到有处理者处理它或者链的末端。每个处理者都持有对下一个处理者的引用,并可以选择处理请求或将其传递给下一个处理者。
2. 适用场景
- 需要多个对象处理同一请求,但不希望明确指定具体处理者。
- 处理者需要灵活组合,支持动态添加或移除。
- 需要避免请求的发送者和接收者之间的耦合。
3. 结构
责任链模式主要由以下角色组成:
- 抽象处理者(Handler):定义处理请求的接口,并持有下一个处理者的引用。
- 具体处理者(Concrete Handler):实现抽象处理者接口,决定是否处理请求,如果不处理则传递给下一个处理者。
- 客户端(Client):创建请求并发送到处理链的起点。
4. 示例代码(Java 实现)
// 抽象处理者
abstract class Handler {
protected Handler nextHandler; // 下一个处理者
public void setNextHandler(Handler nextHandler) {
this.nextHandler = nextHandler;
}
public abstract void handleRequest(int request);
}
// 具体处理者A
class ConcreteHandlerA extends Handler {
@Override
public void handleRequest(int request) {
if (request < 10) {
System.out.println("HandlerA 处理了请求:" + request);
} else if (nextHandler != null) {
nextHandler.handleRequest(request);
}
}
}
// 具体处理者B
class ConcreteHandlerB extends Handler {
@Override
public void handleRequest(int request) {
if (request < 20) {
System.out.println("HandlerB 处理了请求:" + request);
} else if (nextHandler != null) {
nextHandler.handleRequest(request);
}
}
}
// 具体处理者C
class ConcreteHandlerC extends Handler {
@Override
public void handleRequest(int request) {
if (request >= 20) {
System.out.println("HandlerC 处理了请求:" + request);
}
}
}
// 测试代码
public class ChainOfResponsibilityDemo {
public static void main(String[] args) {
Handler handlerA = new ConcreteHandlerA();
Handler handlerB = new ConcreteHandlerB();
Handler handlerC = new ConcreteHandlerC();
// 构建责任链:A -> B -> C
handlerA.setNextHandler(handlerB);
handlerB.setNextHandler(handlerC);
// 发送不同请求
int[] requests = {5, 15, 25};
for (int req : requests) {
handlerA.handleRequest(req);
}
}
}
5. 运行结果:
HandlerA 处理了请求:5
HandlerB 处理了请求:15
HandlerC 处理了请求:25
6. 责任链模式的优缺点
优点:
- 降低耦合度,发送者和接收者解耦。
- 符合开闭原则,可以动态添加新的处理者。
- 增强系统的灵活性,可动态改变责任链结构。
缺点:
- 请求可能会遍历整个责任链,影响性能。
- 责任链过长可能导致调试困难。
- 可能导致部分请求未被处理(如果没有默认处理者)。
7. 责任链模式在实际开发中的应用
- 日志处理(不同级别的日志过滤,如 INFO、WARN、ERROR)
- 权限控制(不同层级的权限认证)
- 审批流程(如请假审批,先部门主管审批,再 HR 审批)
- 中间件设计(如 Servlet 过滤器、Spring 拦截器)
暂时没有回复