| name | Chain of Responsibility |
| description | 将请求沿着处理者链进行传递,直到有处理者处理该请求 |
| license | MIT |
Chain of Responsibility Pattern (责任链模式)
核心概念
Chain of Responsibility是一种Behavioral设计模式。
定义: 将请求沿着一个处理者链进行传递,直到有一个处理者处理该请求。它避免了发送者和接收者之间的紧耦合。
核心思想
- 传递链: 请求从链的首端开始,逐个传递给处理者
- 权责分离: 每个处理者关注自己能处理的请求类型
- 灵活组合: 可以动态添加、移除或重新排列处理者
- 自动降级: 如果一个处理者无法处理,自动传递给下一个
何时使用
触发条件
- 多个处理者,任意一个可以处理请求 - 如日志系统、身份验证、事件处理
- 处理者集合不固定 - 需要动态组织处理流程
- 想要解耦发起者和处理者 - 发起者不关心谁最终处理
- 请求有优先级或依赖关系 - 审批流、事件分发
- 处理过程涉及多个层级 - 如权限验证、异常处理链
不适合场景
- ❌ 只有单一处理者的情况 - 直接调用即可
- ❌ 需要并行处理所有请求 - 应该使用观察者模式
- ❌ 处理顺序完全随意且无规律
基本结构
参与者
- Handler (处理者) - 定义处理请求的接口,包含对下一个处理者的引用
- ConcreteHandler (具体处理者) - 实现处理请求的逻辑,决定是否处理或传递给下一个
- Client (客户端) - 向链中的某个处理者提交请求
UML关系
┌─────────────────┐
│ Handler │
├─────────────────┤
│ - successor │
│ + handleRequest │
└─────────────────┘
△
│ implements
│
┌───┴───────────────────┐
│ │
┌───────────────────┐ ┌─────────────────┐
│ ConcreteHandler1 │ │ ConcreteHandler2 │
├───────────────────┤ ├─────────────────┤
│ + handleRequest() │ │ + handleRequest()│
└───────────────────┘ └─────────────────┘
Client → Handler Chain → Handler1 → Handler2 → Handler3
流程图
请求进入
↓
[Handler1能处理?] → 是 → 处理请求并返回
↓ 否
[Handler2能处理?] → 是 → 处理请求并返回
↓ 否
[Handler3能处理?] → 是 → 处理请求并返回
↓ 否
[还有下一个处理者?] → 是 → 传递给下一个
↓ 否
请求未处理 (返回null或异常)
实现方式对比
方法1: 经典链式实现 (基础)
特点: 最基础的职责链,处理者手动管理next引用
abstract class Handler {
protected Handler successor;
public void setSuccessor(Handler handler) {
this.successor = handler;
}
public abstract void handleRequest(Request request);
}
class ConcreteHandler1 extends Handler {
@Override
public void handleRequest(Request request) {
if (request.getType() == RequestType.TYPE1) {
System.out.println("Handler1 处理请求: " + request);
} else if (successor != null) {
successor.handleRequest(request);
}
}
}
Handler handler1 = new ConcreteHandler1();
Handler handler2 = new ConcreteHandler2();
handler1.setSuccessor(handler2);
handler1.handleRequest(request);
方法2: 动态链式实现 (流式构建)
特点: 使用Builder模式动态构建处理链
class ChainBuilder {
private Handler head;
private Handler tail;
public ChainBuilder add(Handler handler) {
if (head == null) {
head = tail = handler;
} else {
tail.setSuccessor(handler);
tail = handler;
}
return this;
}
public Handler build() {
return head;
}
}
Handler chain = new ChainBuilder()
.add(new AuthenticationHandler())
.add(new AuthorizationHandler())
.add(new LoggingHandler())
.add(new ProcessingHandler())
.build();
chain.handleRequest(request);
方法3: 函数式链式实现
特点: 使用函数式编程,支持Lambda表达式
@FunctionalInterface
interface RequestHandler {
Result handle(Request request, RequestHandler next);
}
class FunctionalChain {
public static RequestHandler chain(List<RequestHandler> handlers) {
return (request, next) -> {
final RequestHandler[] current = {null};
for (int i = handlers.size() - 1; i >= 0; i--) {
final RequestHandler handler = handlers.get(i);
final RequestHandler finalNext = current[0];
current[0] = (req, n) -> handler.handle(req,
(r, fn) -> {
if (finalNext != null) {
return finalNext.handle(r, fn);
}
return new Result(false, "No handler");
});
}
return current[0].handle(request, next);
};
}
}
RequestHandler chain = FunctionalChain.chain(Arrays.asList(
(req, next) -> req.type == 1 ? (, ) : next.handle(req, ),
(req, next) -> req.type == ? (, ) : next.handle(req, ),
(req, next) -> (, )
));
方法4: 事件驱动链 (异步处理)
特点: 基于事件总线,支持异步处理和并发
class EventDrivenChain {
private EventBus eventBus = new EventBus();
private List<EventHandler> handlers = new CopyOnWriteArrayList<>();
public void register(EventHandler handler) {
handlers.add(handler);
eventBus.register(handler);
}
public void process(Request request) {
eventBus.post(new RequestEvent(request));
}
static class EventHandler {
@Subscribe
public void handleRequest(RequestEvent event) {
}
}
}
EventDrivenChain chain = new EventDrivenChain();
chain.register(new ValidationHandler());
chain.register(new ProcessingHandler());
chain.register(new NotificationHandler());
chain.process(request);
8个真实使用场景
场景1: 日志系统 (Logging)
应用: Apache Commons Logging, SLF4J
abstract class LogHandler {
protected LogHandler nextHandler;
protected LogLevel level;
public void setNextHandler(LogHandler handler) {
this.nextHandler = handler;
}
public void log(LogLevel level, String message) {
if (this.level.getValue() <= level.getValue()) {
writeLog(message);
}
if (nextHandler != null) {
nextHandler.log(level, message);
}
}
protected abstract void writeLog(String message);
}
class ErrorHandler extends LogHandler {
public ErrorHandler() { this.level = LogLevel.ERROR; }
protected void writeLog(String msg) { System.err.println("[ERROR] " + msg); }
}
class WarnHandler extends LogHandler {
public WarnHandler() { this.level = LogLevel.WARN; }
protected void { System.out.println( + msg); }
}
();
();
errorHandler.setNextHandler(warnHandler);
场景2: Web请求处理 (Middleware)
应用: Spring Security Filter Chain, Express.js中间件
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) {
return http
.authorizeRequests()
.antMatchers("/public/**").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.and()
.build();
}
}
public class SecurityFilterChain {
private List<SecurityFilter> filters = new ArrayList<>();
public SecurityFilterChain addFilter(SecurityFilter filter) {
filters.add(filter);
return this;
}
public void doFilter(Request req, Response res) {
new FilterChainImpl(filters, 0).doFilter(req, res);
}
}
场景3: 审批工作流 (Approval Workflow)
应用: Alfresco工作流, 企业审批系统
abstract class ApprovalHandler {
protected ApprovalHandler nextApprover;
protected double approvalLimit;
public void setNextApprover(ApprovalHandler handler) {
this.nextApprover = handler;
}
public void handleRequest(ExpenseRequest request) {
if (request.getAmount() <= approvalLimit) {
approve(request);
} else if (nextApprover != null) {
nextApprover.handleRequest(request);
} else {
reject(request);
}
}
abstract void approve(ExpenseRequest request);
abstract void reject(ExpenseRequest request);
}
class ManagerApprover extends ApprovalHandler {
public ManagerApprover() { this.approvalLimit = 5000; }
void approve(ExpenseRequest req) { System.out.println("经理批准: " + req); }
void reject(ExpenseRequest req) { System.out.println("经理拒绝: " + req); }
}
场景4: 事件处理系统 (Event Processing)
应用: Swing事件处理, DOM事件冒泡
abstract class Component {
protected Component parent;
public void setParent(Component parent) {
this.parent = parent;
}
public void handleEvent(Event event) {
if (canHandle(event)) {
processEvent(event);
event.setProcessed(true);
}
if (!event.isProcessed() && parent != null) {
parent.handleEvent(event);
}
}
abstract boolean canHandle(Event event);
abstract void processEvent(Event event);
}
class Button extends Component {
boolean canHandle(Event event) { return event instanceof ClickEvent; }
void processEvent(Event event) { System.out.println("Button clicked"); }
}
场景5: 异常处理链 (Exception Handling)
应用: Java异常处理, 防御性编程
abstract class ExceptionHandler {
protected ExceptionHandler nextHandler;
public void setNextHandler(ExceptionHandler handler) {
this.nextHandler = handler;
}
public void handle(Exception ex) {
if (canHandle(ex)) {
processException(ex);
} else if (nextHandler != null) {
nextHandler.handle(ex);
} else {
System.err.println("未处理的异常: " + ex);
}
}
abstract boolean canHandle(Exception ex);
abstract void processException(Exception ex);
}
class DatabaseExceptionHandler extends ExceptionHandler {
boolean canHandle(Exception ex) { return ex instanceof SQLException; }
void processException(Exception ex) {
System.out.println("数据库异常重试or回滚");
}
}
场景6: 请求验证链 (Validation Chain)
应用: Bean Validation, 表单验证
abstract class Validator {
protected Validator nextValidator;
public void setNextValidator(Validator validator) {
this.nextValidator = validator;
}
public ValidationResult validate(User user) {
ValidationResult result = doValidate(user);
if (!result.isValid()) {
return result;
}
if (nextValidator != null) {
return nextValidator.validate(user);
}
return new ValidationResult(true);
}
abstract ValidationResult doValidate(User user);
}
class EmailValidator extends Validator {
ValidationResult doValidate(User user) {
if (user.email == null || !user.email.contains("@")) {
return new ValidationResult(false, "Invalid email");
}
return new ValidationResult(true);
}
}
场景7: 消息处理管道 (Message Pipeline)
应用: 消息队列处理, 数据流处理
abstract class MessageHandler {
protected MessageHandler next;
public void setNext(MessageHandler handler) {
this.next = handler;
}
public final Message handle(Message message) {
Message result = process(message);
if (next != null && result != null) {
return next.handle(result);
}
return result;
}
abstract Message process(Message message);
}
class EncryptionHandler extends MessageHandler {
Message process(Message msg) {
msg.payload = encrypt(msg.payload);
return msg;
}
}
class BusinessHandler extends MessageHandler {
Message process(Message msg) {
return msg;
}
}
场景8: 路由和调度 (Routing)
应用: 请求路由, 任务调度
abstract class RouteHandler {
protected RouteHandler next;
public void setNext(RouteHandler handler) {
this.next = handler;
}
public Response handle(Request request) {
if (matches(request)) {
return process(request);
}
if (next != null) {
return next.handle(request);
}
return new Response(404, "Not Found");
}
abstract boolean matches(Request request);
abstract Response process(Request request);
}
class GetRouteHandler extends RouteHandler {
boolean matches(Request req) { return "GET".equals(req.method); }
Response process(Request req) { return fetchData(req.path); }
}
class PostRouteHandler extends RouteHandler {
boolean matches { .equals(req.method); }
Response { createData(req.body); }
}
4个常见问题及解决方案
问题1: 链断裂导致请求丢失
症状:
- 有些请求在链中消失,未被处理也未被传递
- 某个处理者忘记调用next.handle()
解决方案:
abstract class SafeHandler implements Handler {
private Handler next;
@Override
public final void handle(Request request) {
if (shouldHandle(request)) {
process(request);
return;
}
if (next != null) {
next.handle(request);
} else {
logUnhandledRequest(request);
}
}
protected abstract boolean shouldHandle(Request request);
protected abstract void process(Request request);
}
class UnsafeHandler {
public void handle(Request request) {
if (request.type == MY_TYPE) {
}
}
}
问题2: 优先级和顺序管理混乱
症状:
- 处理顺序不确定,导致结果不一致
- 高优先级请求可能被低优先级处理者先处理
解决方案:
class PriorityChain {
private PriorityQueue<Handler> handlers = new PriorityQueue<>(
(h1, h2) -> h2.getPriority() - h1.getPriority()
);
public void addHandler(Handler handler) {
handlers.add(handler);
}
public void handle(Request request) {
Handler[] current = new Handler[1];
handlers.forEach(handler -> {
if (current[0] == null && handler.canHandle(request)) {
handler.handle(request);
current[0] = handler;
} else if (current[0] != null) {
handler.setNext(handler);
}
});
}
}
class SortedChain {
private List<Handler> handlers;
public void build() {
handlers.sort((h1, h2) ->
h1.getLevel().compareTo(h2.getLevel())
);
for (int i = 0; i < handlers.size() - 1; i++) {
handlers.get(i).setNext(handlers.get(i + 1));
}
}
}
问题3: 异步处理中的竞态条件
症状:
- 多个线程同时修改处理链
- 请求处理顺序混乱
- 上下文丢失
解决方案:
class ThreadSafeChain {
private final List<Handler> handlers = new CopyOnWriteArrayList<>();
private final ExecutorService executor = Executors.newFixedThreadPool(4);
public void addHandler(Handler handler) {
handlers.add(handler);
}
public Future<Result> handleAsync(Request request) {
return executor.submit(() -> {
for (Handler handler : handlers) {
if (handler.canHandle(request)) {
return handler.handle(request);
}
}
return new Result(false, "Unhandled");
});
}
}
class ContextAwareChain {
private static final ThreadLocal<RequestContext> CONTEXT = new ThreadLocal<>();
public void handle(Request request) {
RequestContext context = new RequestContext(request);
CONTEXT.set(context);
{
process(request);
} {
CONTEXT.remove();
}
}
RequestContext {
CONTEXT.get();
}
}
问题4: 链未匹配时的异常处理
症状:
- 没有处理者能处理请求,返回null
- 调用者无法区分"未处理"和"处理失败"
- 应用状态不可控
解决方案:
class ChainWithResult {
abstract static class Result {
public final boolean processed;
public final String message;
public final Object data;
Result(boolean processed, String message, Object data) {
this.processed = processed;
this.message = message;
this.data = data;
}
}
abstract class Handler {
protected Handler next;
public Result handle(Request request) {
if (canHandle(request)) {
return new Result(true, "Processed", process(request));
}
if (next != null) {
return next.handle(request);
}
return new Result(false, "No handler", null);
}
protected abstract boolean canHandle(Request request);
protected abstract Object ;
}
}
chain.handle(request);
(result.processed) {
System.out.println( + result.data);
} {
System.out.println( + result.message);
handleUnprocessed(request);
}
{
Object UnhandledException {
{
doHandle(request);
} (Exception e) {
(fallbackHandler != ) {
fallbackHandler.handle(request);
}
(, e);
}
}
}
与其他模式的关系
| 模式 | 关系 | 何时结合 |
|---|
| Command | 责任链传递命令对象 | 当请求本身是对象时,如撤销/重做 |
| Observer | 都是处理事件,但方向不同 | 观察者是广播,责任链是线性查找 |
| Strategy | 策略选择处理方式,责任链选择处理者 | 结合确定由哪个策略处理 |
| Template Method | 定义处理步骤框架 | 与责任链结合定义固定处理流程 |
| Decorator | 都是包装和增强 | 使用装饰器动态添加处理者 |
| Composite | 组织处理者的树形结构 | 在树中传递请求 |
| Mediator | 都解耦对象间通信 | 中介者是中心协调,责任链是线性传递 |
最佳实践
1. 使用强类型请求对象
abstract class BaseRequest {}
class EmailRequest extends BaseRequest { String email; }
class ValidationHandler {
Result handle(BaseRequest req) {
if (req instanceof EmailRequest) {
}
}
}
void handle(Object request) {
if (request instanceof String) { ... }
}
2. 定义清晰的处理契约
interface Handler {
boolean handle(Request request);
void setNext(Handler handler);
}
class MyHandler implements Handler {
@Override
public boolean handle(Request request) {
if (isMyDomain(request)) {
doProcess(request);
return true;
}
return false;
}
}
3. 避免"上帝处理者"
class GodHandler {
void handle(Request req) {
}
}
class ValidationHandler extends Handler { }
class AuthHandler extends Handler { }
class LoggingHandler extends Handler { }
class BusinessHandler extends Handler { }
4. 提供链的可视化和调试
class DebugChain {
public void printChain() {
Handler current = head;
int index = 0;
while (current != null) {
System.out.println(index + ": " + current.getClass().getName());
current = current.getNext();
index++;
}
}
public void enableDebugLogging() {
Handler current = head;
while (current != null) {
current.setDebugEnabled(true);
current = current.getNext();
}
}
}
5. 避免无限循环
handler1.setNext(handler2);
handler2.setNext(handler1);
class ChainValidator {
static void validate(Handler head) {
Set<Handler> visited = new HashSet<>();
Handler current = head;
while (current != null) {
if (visited.contains(current)) {
throw new IllegalArgumentException("Circular chain!");
}
visited.add(current);
current = current.getNext();
}
}
}
6. 使用现代Java特性
class StreamChain {
List<Handler> handlers = new ArrayList<>();
public Result handle(Request req) {
return handlers.stream()
.filter(h -> h.canHandle(req))
.findFirst()
.map(h -> h.handle(req))
.orElse(new Result(false, "Unhandled", null));
}
}
何时避免使用
- ❌ 只有唯一处理者 - 直接调用即可,不需要责任链
- ❌ 需要所有处理者都处理 - 使用观察者模式代替
- ❌ 需要并行处理 - 使用线程池或响应式框架
- ❌ 处理者数量动态变化剧烈 - 维护成本高
- ❌ 性能要求极高且链很长 - 递归调用有开销
总结
责任链模式通过将请求处理转移给一系列处理者,实现了请求发送者和处理者的完全解耦。它特别适用于:
- 多个对象可能处理同一请求
- 处理者在运行时才被确定
- 需要动态组织处理流程
关键是避免链断裂、管理好优先级、处理好异常情况,才能充分发挥责任链的优势。