设计模式详解——责任链模式

责任链模式(Chain of Responsibility)

超级通俗一句话:

把多个处理器串成一条链条 ,请求依次经过每个处理器,谁能处理谁处理,处理不了就传给下一个,直到请求被处理完。

你可以把它理解成:

公司请假审批
你提交申请 → 组长 → 经理 → 总监 → 老板
谁有权限批,谁就处理,不用你挨个找。

一、核心特点(必须记住)

  1. 请求发送者 ↔ 处理者 解耦
    发送者不用知道谁处理,处理者不用知道全貌
  2. 链式传递
  3. 动态增删节点
    想加规则直接加节点,不用改原有代码(符合开闭原则)
  4. 每个节点只做一件事(单一职责)

你在项目里天天见:

  • Spring MVC 拦截器
  • Servlet Filter
  • MyBatis 插件
  • 审批流、风控规则、日志、权限校验

二、标准结构(4 个角色)

  1. Handler(抽象处理器):定义处理方法 + 持有下一个处理器
  2. ConcreteHandler(具体处理器):真正处理逻辑
  3. Request(请求):要处理的数据
  4. Chain(链条):串起所有节点

三、Java 代码实战(最简单版本)

我用请假审批来写,一看就懂!

1. 请假请求(Request)

java 复制代码
// 请假请求
public class LeaveRequest {
    private String name;    // 请假人
    private int days;       // 请假天数

    // getter/constructor
}

2. 抽象处理器(Handler)

java 复制代码
public abstract class Approver {
    protected Approver next; // 持有下一个节点

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

    // 处理请求
    public abstract void handle(LeaveRequest request);
}

3. 具体处理器 1:组长

java 复制代码
public class TeamLeader extends Approver {
    @Override
    public void handle(LeaveRequest request) {
        if (request.getDays() <= 1) {
            System.out.println("组长审批:" + request.getName());
        } else if (next != null) {
            next.handle(request); // 传给下一个
        }
    }
}

4. 具体处理器 2:经理

java 复制代码
public class Manager extends Approver {
    @Override
    public void handle(LeaveRequest request) {
        if (request.getDays() <= 3) {
            System.out.println("经理审批:" + request.getName());
        } else if (next != null) {
            next.handle(request);
        }
    }
}

5. 具体处理器 3:总监

java 复制代码
public class Director extends Approver {
    @Override
    public void handle(LeaveRequest request) {
        if (request.getDays() <= 7) {
            System.out.println("总监审批:" + request.getName());
        } else if (next != null) {
            next.handle(request);
        }
    }
}

6. 组装链条 + 使用

java 复制代码
public class Test {
    public static void main(String[] args) {
        Approver teamLeader = new TeamLeader();
        Approver manager = new Manager();
        Approver director = new Director();

        // 串成链条
        teamLeader.setNext(manager);
        manager.setNext(director);

        // 发起请求
        LeaveRequest request = new LeaveRequest("小明", 5);
        teamLeader.handle(request);
    }
}

输出

复制代码
总监审批:小明

四、和装饰器/代理 区别(你一下就能懂)

责任链

  • 目的:流转、分发、依次处理
  • 多个对象依次处理
  • 典型:审批、过滤器、拦截器

装饰器

  • 目的:增强功能、套娃
  • 一个对象,层层包装
  • 典型:IO流、咖啡加牛奶

代理

  • 目的:控制访问、替身
  • 一个对象,一个代理
  • 典型:权限、远程调用

五、超级总结(记住就够)

责任链 = 流水线 / 审批流

请求顺着链条走,谁能处理谁处理

相关推荐
Yu_Lijing10 天前
基于C++的《Head First设计模式》笔记——责任链模式
c++·笔记·设计模式·责任链模式
逆境不可逃20 天前
【从零入门23种设计模式13】行为型之责任链模式
算法·leetcode·游戏·设计模式·责任链模式
what丶k20 天前
深入浅出责任链模式:解耦流程的优雅设计之道
java·责任链模式
sanshizhang21 天前
设计模式-责任链模式
java·设计模式·责任链模式
JTCC21 天前
Java 设计模式西游篇 - 第七回:责任链模式过难关 通关文牒层层批
java·设计模式·责任链模式
fdc20171 个月前
解耦的艺术:用责任链模式构建可插拔的文件处理流水线
c#·.net·责任链模式
YigAin2 个月前
Unity23种设计模式之 责任链模式
设计模式·责任链模式
柏木乃一2 个月前
进程间通信IPC(3)system V标准下基于责任链模式的消息队列,基于建造者模式的信号量
linux·c++·消息队列·建造者模式·责任链模式·信号量·进程间通信ipc
书院门前细致的苹果2 个月前
设计模式大全:单例、工厂模式、策略模式、责任链模式
设计模式·责任链模式·策略模式