跳至正文
来两杯美式
返回

设计模式之责任链模式:请求逐级传递,动态组合处理者

By 来两杯美式
发布于

这是 2020 年 8 月整理的设计模式专题第十三篇。责任链模式是”审批流”的抽象——请求像走流程一样在一条链上逐级传递,每个节点决定自己处理还是传给下一个。Servlet 的 FilterChain 是它的经典应用。

简单说明

责任链模式(Chain of Responsibility Pattern):为请求创建一个接受此请求对象的链

客户端 ──> 处理者1 ──> 处理者2 ──> 处理者3 ──> (结束)
            │           │           │
          能处理?     不能→下传    不能→下传
          能→处理完   能→处理完    能→处理完

代码实现

模拟发布一个课程,需要多级审批:

/**
 * 描述:模拟发布一个课程
 */
@Data
@AllArgsConstructor
public class Course {
    private String courseName;
    private String video;
    private String article;
}

/**
 * 描述:审批人抽象类
 */
public abstract class Approver {
    protected Approver nextApprover;

    protected void setNextApprover(Approver nextApprover) {
        this.nextApprover = nextApprover;
    }

    public abstract void approve(Course course);
}

/**
 * 描述:视频审核人
 */
public class VideoApprover extends Approver {
    @Override
    public void approve(Course course) {
        if (null == course || null == course.getVideo()) {
            System.out.println("video审核失败");
            return;
        }
        System.out.println("video审核成功");
        // 处理完,传给下一个处理者
        if (null != nextApprover) {
            nextApprover.approve(course);
        }
    }
}

/**
 * 描述:手记审核人
 */
public class ArticleApprover extends Approver {
    @Override
    public void approve(Course course) {
        if (null == course || null == course.getArticle()) {
            System.out.println("article审核失败");
            return;
        }
        System.out.println("article审核成功");
        if (null != nextApprover) {
            nextApprover.approve(course);
        }
    }
}

public class Test {
    public static void main(String[] args) {
        Approver videoApprover = new VideoApprover();
        Approver articleApprover = new ArticleApprover();

        // 动态组合:视频审核 → 手记审核
        videoApprover.setNextApprover(articleApprover);

        Course course = new Course("Java架构师", "video.mp4", "article.md");
        videoApprover.approve(course);
    }
}

链式结构

动态组合:链的顺序和成员完全由组装代码决定。今天要”视频→手记”,明天要”手记→视频”或加一个”整体审核人”,改组装代码即可,处理者类本身不动。

责任链的价值

对比项硬编码 if-else 审批责任链模式
发送者与处理者发送者要认识所有处理者发送者只认识链头
组合方式写死在代码里运行时动态组装
新增处理者改业务代码加一个处理者类 + 组装
职责集中在发送者分散到每个处理者

链的两种流转方式

适用场景与优缺点

适用场景

优点

缺点

现实中的应用

场景说明
javax.servlet.FilterChain过滤器链逐级处理请求
Spring MVC 拦截器HandlerInterceptor 链
MyBatis 插件拦截器层层处理 SQL
Netty PipelineChannelHandler 责任链处理 IO 事件
审批流请假/报销/发布的多级审批

小结


分享这篇文章:
通过邮件分享这篇文章✓ 链接已复制
查看系列全部文章
  1. 01.软件设计原则:SOLID + KISS / YAGNI / LOD 全景
  2. 02.设计模式之原型模式,及深浅拷贝
  3. 03.设计模式之工厂模式:简单工厂、工厂方法与抽象工厂
  4. 04.设计模式之建造者模式:复杂对象的组装艺术
  5. 05.设计模式之适配器模式:让不兼容的接口协同工作
  6. 06.设计模式之桥接模式:抽象与实现分离,各自独立变化
  7. 07.设计模式之装饰者模式:动态增强,比继承更有弹性
  8. 08.设计模式之代理模式:静态代理与 JDK 动态代理
  9. 09.设计模式之外观模式:统一门面,简化子系统调用
  10. 10.设计模式之享元模式:共享细粒度对象,降低内存占用
  11. 11.设计模式之策略模式:算法家族,自由切换
  12. 12.设计模式之模板方法模式:固定骨架,可变步骤
  13. 13.设计模式之观察者模式:一对多依赖,状态变更自动通知
  14. 14.设计模式之责任链模式:请求逐级传递,动态组合处理者
  15. 15.设计模式之状态模式:状态变,行为变
  16. 16.设计模式之迭代器模式:不暴露内部实现,顺序访问集合

上一篇
Docker Compose 多容器编排:从命令到声明式
下一篇
Maxwell 数据初始化:maxwell-bootstrap 全量同步实践