职责链模式 (Chain of Responsibility Pattern) —— “接力处理“设计模式

🌟 核心思想

职责链模式允许你将请求沿着处理链传递,直到有一个处理者能够处理它。就像公司中的审批流程:员工提交申请后,申请会从主管→经理→总监逐级传递,直到找到有足够权限审批的人。


🏢 现实世界类比:多级审批系统

  • 基层员工:提交报销申请(请求)

  • 主管:可审批≤1000元的费用

  • 经理:可审批≤5000元的费用

  • 财务总监:可审批所有费用

  • 审批链:主管 → 经理 → 总监


🏗 三大核心角色

角色作用审批系统示例
Handler(处理者接口)定义处理请求的接口审批人接口
ConcreteHandler(具体处理者)实现具体的处理逻辑主管/经理/总监
Client(客户端)创建处理链并提交请求提交报销的员工

📜 代码示例(Java实现)

1. 定义处理者接口和具体处理者

java

复制

// 审批人接口
interface Approver {
    void setNextApprover(Approver next);
    void processRequest(Expense expense);
}

// 具体处理者:主管
class Supervisor implements Approver {
    private Approver next;
    private final double MAX_AMOUNT = 1000;

    public void setNextApprover(Approver next) {
        this.next = next;
    }

    public void processRequest(Expense expense) {
        if (expense.getAmount() <= MAX_AMOUNT) {
            System.out.println("主管审批通过:" + expense.getDescription());
        } else if (next != null) {
            next.processRequest(expense); // 传递给下一级
        }
    }
}

// 具体处理者:经理
class Manager implements Approver {
    private Approver next;
    private final double MAX_AMOUNT = 5000;

    public void setNextApprover(Approver next) {
        this.next = next;
    }

    public void processRequest(Expense expense) {
        if (expense.getAmount() <= MAX_AMOUNT) {
            System.out.println("经理审批通过:" + expense.getDescription());
        } else if (next != null) {
            next.processRequest(expense); // 传递给下一级
        }
    }
}

// 具体处理者:总监
class Director implements Approver {
    public void setNextApprover(Approver next) {
        // 总监是最高级别,没有下一级
    }

    public void processRequest(Expense expense) {
        System.out.println("总监审批通过:" + expense.getDescription());
    }
}

2. 定义请求对象

java

复制

// 报销申请类
class Expense {
    private final String description;
    private final double amount;

    public Expense(String desc, double amount) {
        this.description = desc;
        this.amount = amount;
    }

    public double getAmount() {
        return amount;
    }

    public String getDescription() {
        return description;
    }
}

3. 客户端使用

java

复制

public class Company {
    public static void main(String[] args) {
        // 构建责任链
        Approver supervisor = new Supervisor();
        Approver manager = new Manager();
        Approver director = new Director();
        
        supervisor.setNextApprover(manager);
        manager.setNextApprover(director);

        // 提交不同金额的报销
        supervisor.processRequest(new Expense("办公用品", 800));   // 主管审批
        supervisor.processRequest(new Expense("团队建设", 3500)); // 经理审批
        supervisor.processRequest(new Expense("年会费用", 20000)); // 总监审批
    }
}

输出结果:

复制

主管审批通过:办公用品
经理审批通过:团队建设
总监审批通过:年会费用

✅ 优点

✔ 解耦发送者和接收者:请求者无需知道具体处理者
✔ 动态调整责任链:可运行时修改处理链顺序
✔ 符合开闭原则:新增处理者不影响现有代码


❌ 缺点

✖ 请求可能未被处理:需要保证链的完整性
✖ 性能影响:长链可能导致处理延迟


🎯 适用场景

  • 需要多个对象处理同一请求,但具体处理者未知

  • 需要动态指定处理顺序

  • 审批流程、异常处理、事件过滤等场景

典型应用:

  • Java Servlet中的Filter链

  • 日志系统的多级过滤

  • 游戏中的伤害处理系统


🔄 对比其他模式

模式目的关键区别
职责链模式请求的接力处理关注请求的传递过程
命令模式封装请求为对象关注请求的封装与执行
状态模式状态驱动的行为改变关注内部状态转换

模式进阶技巧

  1. 短路处理:某些处理者可以直接终止传递

  2. 组合模式:构建树形责任链

  3. 拦截机制:双向责任链(处理请求和响应)


总结

职责链模式就像处理接力赛,它:

  1. 解耦请求与处理:让多个对象都有机会处理请求

  2. 灵活配置流程:动态调整处理顺序

  3. 简化对象间连接:每个处理者只需关注下一环节

💡 设计箴言:"让请求在链上旅行,直到找到它的归宿" —— 职责链模式精髓

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值