责任链模式(Chain of Responsibility Pattern)为请求创建了一个接受者对象的链。这种模式给予请求的类型,对请求的发送者和接受者进行解耦。在这种模式中,通常每个接受者都包含对另一个接受者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,以此类推。
核心组成
- 抽象处理者(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); }
|
- 具体处理者(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 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)
: 根据日志级别决定是否记录。
异常处理链
: 不同层级尝试捕获和处理异常。