with one click
chain-of-responsibility
将请求沿着处理者链进行传递,直到有处理者处理该请求
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Menu
将请求沿着处理者链进行传递,直到有处理者处理该请求
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Based on SOC occupation classification
以聚合根为边界,包含多个相关Entity和ValueObject的集合。保证数据一致性和事务边界。
在DDD中具有唯一身份标识和生命周期的对象,通过身份而非属性值相等判断。
封装复杂对象和聚合的创建过程,将创建职责从领域对象中剥离,保证聚合创建时的不变量满足。
没有身份标识,通过属性值判断相等的对象。不可变,通常代表领域中的度量或描述。
命令查询责任分离,将数据的写入操作和读取操作分别用不同的模型处理,优化各自的性能。
将DDD战略设计应用于微服务架构,限界上下文指导服务拆分,领域事件实现服务间通信。
| name | Chain of Responsibility |
| description | 将请求沿着处理者链进行传递,直到有处理者处理该请求 |
| license | MIT |
Chain of Responsibility是一种Behavioral设计模式。
定义: 将请求沿着一个处理者链进行传递,直到有一个处理者处理该请求。它避免了发送者和接收者之间的紧耦合。
┌─────────────────┐
│ Handler │
├─────────────────┤
│ - successor │
│ + handleRequest │
└─────────────────┘
△
│ implements
│
┌───┴───────────────────┐
│ │
┌───────────────────┐ ┌─────────────────┐
│ ConcreteHandler1 │ │ ConcreteHandler2 │
├───────────────────┤ ├─────────────────┤
│ + handleRequest() │ │ + handleRequest()│
└───────────────────┘ └─────────────────┘
Client → Handler Chain → Handler1 → Handler2 → Handler3
请求进入
↓
[Handler1能处理?] → 是 → 处理请求并返回
↓ 否
[Handler2能处理?] → 是 → 处理请求并返回
↓ 否
[Handler3能处理?] → 是 → 处理请求并返回
↓ 否
[还有下一个处理者?] → 是 → 传递给下一个
↓ 否
请求未处理 (返回null或异常)
特点: 最基础的职责链,处理者手动管理next引用
// Handler接口
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);
特点: 使用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);
特点: 使用函数式编程,支持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 ? new Result(true, "handled") : next.handle(req, null),
(req, next) -> req.type == 2 ? new Result(true, "handled") : next.handle(req, null),
(req, next) -> new Result(false, "unhandled")
));
特点: 基于事件总线,支持异步处理和并发
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);
应用: Apache Commons Logging, SLF4J
// 日志处理链:ERROR -> WARN -> INFO -> DEBUG -> TRACE
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 writeLog(String msg) { System.out.println("[WARN] " + msg); }
}
// 构建链
LogHandler errorHandler = new ErrorHandler();
LogHandler warnHandler = new WarnHandler();
errorHandler.setNextHandler(warnHandler);
应用: Spring Security Filter Chain, Express.js中间件
// Spring Security FilterChain
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) {
return http
.authorizeRequests()
.antMatchers("/public/**").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.and()
.build(); // 内部构建责任链
}
}
// 中间件链: CORS → Authentication → Authorization → Logging
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);
}
}
应用: Alfresco工作流, 企业审批系统
// 审批流:员工 → 部门经理 → 总监 → CFO → CEO
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); }
}
应用: Swing事件处理, DOM事件冒泡
// GUI事件链: 按钮 → 容器 → 窗口
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"); }
}
应用: Java异常处理, 防御性编程
// 异常处理链: 业务异常 → IO异常 → 系统异常 → 默认
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回滚");
}
}
应用: 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);
}
}
应用: 消息队列处理, 数据流处理
// 消息处理链: 反序列化 → 加密 → 业务处理 → 序列化
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;
}
}
应用: 请求路由, 任务调度
// 路由链: HTTP方法识别 → 内容类型 → API版本 → 具体处理
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(Request req) { return "POST".equals(req.method); }
Response process(Request req) { return createData(req.body); }
}
症状:
解决方案:
// ✅ 好的做法:使用模板方法确保链传递
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) {
// 处理...
// 忘记了传递给next!
}
}
}
症状:
解决方案:
// ✅ 使用PriorityQueue维护优先级
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() {
//按照levels严格排序
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));
}
}
}
症状:
解决方案:
// ✅ 使用CopyOnWriteArrayList确保线程安全
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");
});
}
}
// ✅ 使用ThreadLocal保存请求上下文
class ContextAwareChain {
private static final ThreadLocal<RequestContext> CONTEXT = new ThreadLocal<>();
public void handle(Request request) {
RequestContext context = new RequestContext(request);
CONTEXT.set(context);
try {
process(request);
} finally {
CONTEXT.remove();
}
}
protected RequestContext getContext() {
return CONTEXT.get();
}
}
症状:
解决方案:
// ✅ 使用Result模式返回明确的结果
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 process(Request request);
}
}
// 使用
Result result = chain.handle(request);
if (result.processed) {
System.out.println("已处理: " + result.data);
} else {
System.out.println("未处理: " + result.message);
handleUnprocessed(request);
}
// ✅ 或使用异常处理
class ChainWithFallback {
public Object handle(Request request) throws UnhandledException {
try {
return doHandle(request);
} catch (Exception e) {
if (fallbackHandler != null) {
return fallbackHandler.handle(request);
}
throw new UnhandledException("Chain exhausted", e);
}
}
}
| 模式 | 关系 | 何时结合 |
|---|---|---|
| Command | 责任链传递命令对象 | 当请求本身是对象时,如撤销/重做 |
| Observer | 都是处理事件,但方向不同 | 观察者是广播,责任链是线性查找 |
| Strategy | 策略选择处理方式,责任链选择处理者 | 结合确定由哪个策略处理 |
| Template Method | 定义处理步骤框架 | 与责任链结合定义固定处理流程 |
| Decorator | 都是包装和增强 | 使用装饰器动态添加处理者 |
| Composite | 组织处理者的树形结构 | 在树中传递请求 |
| Mediator | 都解耦对象间通信 | 中介者是中心协调,责任链是线性传递 |
// ✅ 好
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) { ... }
}
// ✅ 定义接口,明确职责
interface Handler {
/**
* @return true如果自己处理了,false则传递给下一个
*/
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; // 需要传递
}
}
// ❌ 一个处理者做太多事
class GodHandler {
void handle(Request req) {
// 验证、授权、日志、业务、发送邮件、缓存...
}
}
// ✅ 职责分离
class ValidationHandler extends Handler { }
class AuthHandler extends Handler { }
class LoggingHandler extends Handler { }
class BusinessHandler extends Handler { }
// ✅ 支持链的检视和调试
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();
}
}
}
// ❌ 危险
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();
}
}
}
// ✅ 使用Stream API简化链处理
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));
}
}
责任链模式通过将请求处理转移给一系列处理者,实现了请求发送者和处理者的完全解耦。它特别适用于:
关键是避免链断裂、管理好优先级、处理好异常情况,才能充分发挥责任链的优势。