【设计模式】责任链模式

简介

很多公司都有请假的流程,当员工提交请假申请时,请求会沿着 组长 → 经理 → CEO 的链条传递,直到有对应层级的领导处理。

适用场景

  1. 一个请求需要多个对象中的一个或多个处理(如审批流程、过滤器链)。
  2. 处理对象和顺序需动态指定(如中间件、事件冒泡)。
  3. 数据清洗(去重)→格式转换→校验→写入数据库,每个步骤作为独立处理器,支持动态插拔。
  4. 日志消息同时发送至控制台、文件、第三方监控系统(所有处理器均执行,不中断链)
  5. 订单提交后触发库存锁定→支付验证→物流分配→通知推送,失败时回滚或转人工处理。
  6. 传感器信号经过噪声过滤→数据格式化→异常检测→触发告警,动态调整处理顺序。
  7. 医疗诊断系统中,症状数据依次由规则引擎→机器学习模型→专家人工复核处理。

优点

  1. 解耦:发送者无需关心谁来处理请求。
  2. 灵活:可动态调整处理链顺序或新增节点。

缺点

  1. 请求可能未被处理:如果链条未覆盖所有情况。
  2. 性能问题:长链条可能导致延迟。

类图

代码

java 复制代码
// 抽象处理者
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请求依次经过认证、权限、日志过滤器。

java 复制代码
// 抽象过滤器
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); // 依次触发三个过滤器
    }
}
相关推荐
烛阴8 分钟前
【TS 设计模式完全指南】用工厂方法模式打造你的“对象生产线”
javascript·设计模式·typescript
_请输入用户名3 小时前
EventEmitter 是广播,Tapable 是流水线:聊聊它们的本质区别
前端·设计模式
Buling_04 小时前
游戏中的设计模式——第一篇 设计模式简介
游戏·设计模式
小蜗牛在漫步4 小时前
设计模式六大原则2-里氏替换原则
设计模式·里氏替换原则
小蜗牛在漫步6 小时前
23种设计模式-Proxy模式
设计模式·代理模式
易元9 小时前
模式组合应用-装饰器模式
后端·设计模式
宁静致远202110 小时前
【C++设计模式】第二篇:策略模式(Strategy)--从基本介绍,内部原理、应用场景、使用方法,常见问题和解决方案进行深度解析
c++·设计模式·策略模式
CHANG_THE_WORLD10 小时前
C++ 并发编程指南 并发设计模式:Actor vs. CSP (生活场景版)
c++·设计模式·生活
零千叶11 小时前
【面试】AI大模型应用原理面试题
java·设计模式·面试
烛阴21 小时前
【TS 设计模式完全指南】从“入门”到“劝退”,彻底搞懂单例模式
javascript·设计模式·typescript