摘要:责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,允许将请求沿着处理链传递,直到某个对象处理它或链结束。它的核心思想是解耦请求发送者和接收者,允许多个对象都有机会处理请求。
责任链模式(Chain of Responsibility Pattern)是一种 行为型设计模式,允许将请求沿着处理链传递,直到某个对象处理它或链结束。它的核心思想是 解耦请求发送者和接收者,允许多个对象都有机会处理请求。
模式结构
抽象处理者(Handler)Ø 定义处理请求的接口(通常包含 handleRequest 方法)。
Ø 持有下一个处理者的引用(nextHandler)。
具体处理者(Concrete Handler)Ø 实现 handleRequest 方法,决定是否处理请求或传递给下一个处理者。
客户端(Client)Ø 构建处理链,并向链的头部发起请求。
代码示例:请假审批流程
假设一个公司请假审批流程:
员工 → 经理(3天内) → 总监(5天内) → CEO(不限天数)
1. 定义抽象处理者
java
public abstract class Handler {
protected Handler nextHandler; // 下一个处理者
public void setNext(Handler nextHandler) {
this.nextHandler = nextHandler;
}
public abstract void handleRequest(int days);
}
2. 具体处理者实现
java
// 经理处理者(审批3天内的请假)
public class ManagerHandler extends Handler {
@Override
public void handleRequest(int days) {
if (days
System.out.println("经理批准了" + days + "天假期");
} else if (nextHandler != null) {
nextHandler.handleRequest(days); // 传递给下一个处理者
}
}
}
// 总监处理者(审批5天内的请假)
public class DirectorHandler extends Handler {
@Override
public void handleRequest(int days) {
if (days
System.out.println("总监批准了" + days + "天假期");
} else if (nextHandler != null) {
nextHandler.Handlerequest(days);
}
}
}
// CEO处理者(审批所有请假)
public class CEOHandler extends Handler {
@Override
public void handleRequest(int days) {
System.out.println("CEO批准了" + days + "天假期");
}
}
3. 客户端构建责任链
java
public class Client {
public static void main(String args) {
// 创建处理者
Handler manager = new ManagerHandler;
Handler director = new DirectorHandler;
Handler ceo = new CEOHandler;
// 构建责任链:Manager → Director → CEO
manager.setNext(director);
director.setNext(ceo);
// 发起请求
manager.handleRequest(2); // 经理处理
manager.handleRequest(4); // 总监处理
manager.handleRequest(6); // CEO处理
}
}
输出结果:
经理批准了2天假期
总监批准了4天假期
CEO批准了6天假期
责任链模式的特点
优点
解耦请求与处理:发送者无需知道具体由谁处理请求。动态扩展性:可灵活增删处理者或调整链的顺序。符合单一职责原则:每个处理者只负责自己的逻辑。缺点
请求可能未被处理:需要确保链的完整性。性能问题:长链可能导致请求传递较慢。应用场景
多级审批流程(如请假、报销)。事件处理系统(如Java AWT事件传播)。日志记录框架(不同级别的Logger处理)。Web请求过滤链(如Servlet Filter、Spring Security)。变体与注意事项
纯责任链:请求必须被某个处理者处理(如未处理,需抛出异常)。不纯责任链:允许请求未被处理(需兜底逻辑)。提前终止:处理者处理请求后,可选择是否继续传递。责任链模式通过链式传递请求,实现了灵活的职责分配,是处理复杂流程的经典方案。
来源:老客数据一点号