责任链模式(Chain of responsibility Pattern)

责任链模式(Chain of Responsibility Pattern)为请求创建了一个接受者对象的链。这种模式给予请求的类型,对请求的发送者和接受者进行解耦。在这种模式中,通常每个接受者都包含对另一个接受者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,以此类推

核心组成

  1. 抽象处理者(Handler)

定义处理请求的接口,并持有下一个处理者的引用。

1
2
3
4
5
6
7
8
9
10
public abstract class Handler {
protected Handler nextHandler;

public void setNextHandler(Handler nextHandler) {
this.nextHandler = nextHandler;
}

public abstract void handleRequest(String request);
}

  1. 具体处理者(Concrete Handlers)

实现具体的请求处理逻辑,可以选择处理或转发请求。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class ConcreteHandlerA extends Handler {
@Override
public void handleRequest(String request) {
if ("A".equals(request)) {
System.out.println("ConcreteHandlerA 处理了请求:" + request);
} else if (nextHandler != null) {
System.out.println("ConcreteHandlerA 无法处理,转交给下一个...");
nextHandler.handleRequest(request);
}
}
}

public class ConcreteHandlerB extends Handler {
@Override
public void handleRequest(String request) {
if ("B".equals(request)) {
System.out.println("ConcreteHandlerB 处理了请求:" + request);
} else if (nextHandler != null) {
System.out.println("ConcreteHandlerB 无法处理,转交给下一个...");
nextHandler.handleRequest(request);
}
}
}
  1. 客户端代码

构建责任链并发起请求。

1
2
3
4
5
6
7
val handlerA = ConcreteHandlerA()
val handlerB = ConcreteHandlerB()

handlerA.setNextHandler(handlerB)
handlerA.handleRequest("A")
handlerA.handleRequest("B")
handlerA.handleRequest("C")

优点

  • 解耦: 请求发送者与处理者之间无需指导彼此,只需知道链的存在。
  • 可扩展性强: 可以动态地增加或修改处理链上的节点。
  • 职责分离: 每个处理者只关注自己的处理逻辑。

缺点

  • 请求可能未被处理: 如果链中没有合适的处理者,请求可能会被忽略。
  • 调试复杂: 请求在链中传递时,调试和追踪较难。
  • 性能问题: 若链过长或处理逻辑复杂,可能影响性能。

Java中的典型应用

  • Spring interceptor/Filter: 用于请求拦截和预处理。
  • Java Servlet Filter: 对HTTP请求进行过滤。
  • 日志框架(如Log4j): 根据日志级别决定是否记录。
  • 异常处理链: 不同层级尝试捕获和处理异常。