简介
很多公司都有请假的流程,当员工提交请假申请时,请求会沿着 组长 → 经理 → CEO
的链条传递,直到有对应层级的领导处理。
适用场景
- 一个请求需要多个对象中的一个或多个处理(如审批流程、过滤器链)。
- 处理对象和顺序需动态指定(如中间件、事件冒泡)。
- 数据清洗(去重)→格式转换→校验→写入数据库,每个步骤作为独立处理器,支持动态插拔。
- 日志消息同时发送至控制台、文件、第三方监控系统(所有处理器均执行,不中断链)
- 订单提交后触发库存锁定→支付验证→物流分配→通知推送,失败时回滚或转人工处理。
- 传感器信号经过噪声过滤→数据格式化→异常检测→触发告警,动态调整处理顺序。
- 医疗诊断系统中,症状数据依次由规则引擎→机器学习模型→专家人工复核处理。
优点
- 解耦:发送者无需关心谁来处理请求。
- 灵活:可动态调整处理链顺序或新增节点。
缺点
- 请求可能未被处理:如果链条未覆盖所有情况。
- 性能问题:长链条可能导致延迟。
类图
代码
// 抽象处理者
abstract class Approver {
protected Approver successor;
public void setNext(Approver successor) {
this.successuccessor = successor;
}
public abstract void processRequest(int days);
}
// 具体处理者:组长
class GroupLeader extends Approver {
@Override
public void processRequest(int days) {
if (days <= 3) {
System.out.println("组长审批通过,请假" + days + "天");
} else if (successor != null) {
successor.processRequest(days);
}
}
}
// 具体处理者:经理
class Manager extends Approver {
@Override
public void processRequest(int days) {
if (days <= 7) {
System.out.println("经理审批通过,请假" + days + "天");
} else if (successor != null) {
successor.processRequest(days);
}
}
}
// 具体处理者:CEO
class CEO extends Approver {
@Override
public void processRequest(int days) {
System.out.println("CEO审批通过,请假" + days + "天");
}
}
// 客户端
public class Client {
public static void main(String[] args) {
Approver groupLeader = new GroupLeader();
Approver manager = new Manager();
Approver ceo = new CEO();
groupLeader.setNext(manager);
manager.setNext(ceo);
// 提交请假申请
groupLeader.processRequest(5); // 经理处理
groupLeader.processRequest(10); // CEO处理
}
}
场景
Web请求过滤器链,HTTP请求依次经过认证、权限、日志过滤器。
// 抽象过滤器
abstract class Filter {
private Filter next;
public Filter setNext(Filter next) {
this.next = next;
return next;
}
public void doFilter(HttpRequest request) {
handle(request);
if (next != null) {
next.doFilter(request);
}
}
protected abstract void handle(HttpRequest request);
}
// 具体过滤器:认证
class AuthFilter extends Filter {
@Override
protected void handle(HttpRequest request) {
System.out.println("认证检查:用户已登录");
}
}
// 具体过滤器:权限
class PermissionFilter extends Filter {
@Override
protected void handle(HttpRequest request) {
System.out.println("权限检查:用户有访问权限");
}
}
// 具体过滤器:日志
class LogFilter extends Filter {
@Override
protected void handle(HttpRequest request) {
System.out.println("记录请求日志");
}
}
// 客户端
public class WebServer {
public static void main(String[] args) {
Filter authFilter = new AuthFilter();
Filter permissionFilter = new PermissionFilter();
Filter logFilter = new LogFilter();
authFilter.setNext(permissionFilter).setNext(logFilter);
HttpRequest request = new HttpRequest();
authFilter.doFilter(request); // 依次触发三个过滤器
}
}