N

Norlcayn的博客

A text-focused Halo theme

  • 首页
  • 文章
  • 默认分类
  • 关于
主页 责任链模式
文章

责任链模式

发表于 2026-01-16 更新于 昨天
作者 Administrator
7~9 分钟 阅读

基本理论

责任链模式允许请求沿着处理链进行传递,链中的每个处理者都要决定是自己处理,还是交给下一环处理

在这里有一个很经典的案例就是请假审批,比如我们有这样一个需求,就是当员工请假时,审批规则如下:

  1. 请假天数少于3天,组长审批
  2. 请假天数在3-5天,主管审批
  3. 请求天数大于5天,经理审批

此时就可以使用责任链模式来编写这个代码,这种设计模式有三个核心角色:

  • 抽象处理者:通常包含一个指向下一个处理者的引用和一个处理方法的声明
  • 具体处理者:指定下一个处理者是谁,并且要实现处理的方法
  • 客户端:创建处理者对象并组成责任链的结构,负责将请求发送给第一个处理者

223fbd43-4b5a-4ff2-bb4c-fc2de1410031 (1)

测试代码如下:

package com.jzo2o.orders.dispatch.test;

public class ApproveTest {
    public static void main(String[] args) {
        //定义审批链
        Handler handler = new JingLiHandler(new ZhuGuangHandler(new ZuZhangHandler(null)));
        handler.approve(3);
        handler.approve(5);
        handler.approve(7);
    }

}

//定义业务处理接口
abstract class Handler {
    //定义自己的下一级处理者
    Handler next;

    public Handler(Handler handler) {
        this.next = handler;
    }

    //定义请假审批方法
    public abstract void approve(int days);
}

//组长审批类
class ZuZhangHandler extends Handler {
    public ZuZhangHandler(Handler handler) {
        super(handler);
    }

    @Override
    public void approve(int days) {
        if (days <= 3) {
            System.out.println("组长审批,允许请假");
        } else {
            next.approve(days);
        }
    }
}

//主管审批类
class ZhuGuangHandler extends Handler {
    public ZhuGuangHandler(Handler handler) {
        super(handler);
    }

    @Override
    public void approve(int days) {
        if (days > 3 && days <= 5) {
            System.out.println("主管审批,允许请假");
        } else {
            next.approve(days);
        }
    }
}

//经理审批类
class JingLiHandler extends Handler {
    public JingLiHandler(Handler handler) {
        super(handler);
    }

    @Override
    public void approve(int days) {
        if (days > 5) {
            System.out.println("经理审批,允许请假");
        } else {
            next.approve(days);
        }
    }
}
云岚到家相关技术栈
设计模式 责任链模式
许可协议:  CC BY 4.0
分享

相关文章

1月 16, 2026

状态机

什么是状态机 需求说明 在订单模块中订单共设计了7种状态,如下图 订单会在多个状态间进行转换,这就需要开发人员都去记忆这些转换关系,这是非常麻烦的 if(订单状态 == 待支付){ //如果用户支付成功,执行此场景下的业务逻辑,更新订单状态为派单中 update(id,派单中) ) if(

1月 16, 2026

数据表设计规范

设计范式 数据库设计三范式: 第一范式:数据表中的每一列都是原子的,不可再拆分 第二范式:每张表中的一条记录只描述一个实体 第三范式:数据表中不要存在冗余字段(可以通过其他字段推导出的字段) 1)第一范式:数据表中的每一列都是原子的,不可再拆分 有一张用户考勤表设计如下 id 用户名 考勤时间 1

1月 16, 2026

缓存优化

针对系统中访问频率很高的页面,常见的优化方案如下: 将页面做页面静态化处理 如果静态化之后依旧无法满足需求,可以将静态资源转移到CDN服务器 页面上变动的内容可以异步请求后端服务器获取数据,后端可以添加缓存来减轻数据库的压力 数据库方面可以通过合理的存储引擎选择、表字段设计、索引设计等进一步提高查询

下一篇

超卖方案(线程锁)

上一篇

EasyExcel(报表导出)

最近更新

  • Hello Halo
  • 状态机
  • 数据表设计规范
  • 缓存优化
  • 事务失效

热门标签

Halo 异常处理 Redisson 并行 Vue 并发 递归 请求限流 SpringAMQP 类加载器

目录

©2026 Norlcayn的博客. 保留部分权利。

使用 Halo 主题 Chirpy