当前位置: 首页 > article >正文

责任链模式 Chain of Responsibility

1 意图

使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

2 结构

在这里插入图片描述

  • Handler 定义一个处理请求的接口;(可选)实现后继链。

  • ConcreteHandler 处理它所负责的请求;可访问它的后继者;如果可处理该请求理它,否则将该请求转发给后继者。

  • Client 向链上的具体处理者**(ConcreteHandler)**对象提交请求。

3 适用性

Chain ofResponsibility 模式适用于以下条件:

  • 有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。

  • 想在不明确指定接收者的情况下向多个对象中的一个提交一个请求。

  • 可处理一个请求的对象集合应被动态指定。

4 应用举例

1 应用案例:请假审批流程

假设在一个公司中,员工请假需要经过不同级别的审批,例如,1天以内的请假由直接上级批准,2天到5天的请假由部门经理批准,超过5天的请假由人力资源部批准。我们可以使用责任链模式来实现这样的审批流程。

Java代码示例:

// 抽象处理者
abstract class LeaveApprover {
    protected LeaveApprover nextApprover; // 后继处理者

    public void setNextApprover(LeaveApprover nextApprover) {
        this.nextApprover = nextApprover;
    }

    // 审批请假
    public abstract void processRequest(int leaveDays);
}

// 直接上级
class DirectSupervisor extends LeaveApprover {
    @Override
    public void processRequest(int leaveDays) {
        if (leaveDays <= 1) {
            System.out.println("直接上级批准了 " + leaveDays + " 天的请假。");
        } else {
            if (nextApprover != null) {
                nextApprover.processRequest(leaveDays);
            } else {
                System.out.println("没有后续处理者,无法审批超过 " + leaveDays + " 天的请假。");
            }
        }
    }
}

// 部门经理
class DepartmentManager extends LeaveApprover {
    @Override
    public void processRequest(int leaveDays) {
        if (leaveDays <= 5) {
            System.out.println("部门经理批准了 " + leaveDays + " 天的请假。");
        } else {
            if (nextApprover != null) {
                nextApprover.processRequest(leaveDays);
            } else {
                System.out.println("没有后续处理者,无法审批超过 " + leaveDays + " 天的请假。");
            }
        }
    }
}

// 人力资源部
class HRDepartment extends LeaveApprover {
    @Override
    public void processRequest(int leaveDays) {
        System.out.println("人力资源部批准了 " + leaveDays + " 天的请假。");
    }
}

public class ChainOfResponsibilityDemo {
    public static void main(String[] args) {
        LeaveApprover directSupervisor = new DirectSupervisor();
        LeaveApprover departmentManager = new DepartmentManager();
        LeaveApprover hrDepartment = new HRDepartment();

        // 构建责任链
        directSupervisor.setNextApprover(departmentManager);
        departmentManager.setNextApprover(hrDepartment);

        // 提交请假申请
        int leaveDays = 3;
        directSupervisor.processRequest(leaveDays); // 将请求发送给直接上级

        leaveDays = 7;
        directSupervisor.processRequest(leaveDays); // 再次提交更长时间的请假申请
    }
}

在这个例子中:

  • LeaveApprover 是抽象处理者,定义了处理请求的接口。
  • DirectSupervisor, DepartmentManager, HRDepartment 分别是具体处理者,每个处理者都有自己的判断逻辑,如果当前处理者不能处理请求,则会将其传递给下一个处理者。

通过责任链模式,我们可以灵活地添加、删除或修改处理者,而不影响其他部分的代码,这使得系统具有更好的扩展性和维护性。


http://www.kler.cn/a/382667.html

相关文章:

  • A15基于Spring Boot的宠物爱心组织管理系统的设计与实现
  • C语言中的分支和循环:深入理解与应用
  • 进程与线程+多线程优势
  • linux node vue3 部署手册
  • pytest高版本兼容test_data[“log“] = _handle_ansi(“\n“.join(logs))错误
  • Multi Agents协作机制设计及实践
  • 【力扣打卡系列】单调栈
  • 熊猫追剧 1.0.0 | 免费追剧软件,全网资源,独家蓝光。
  • 传智杯 第六届-复赛-第二场-C
  • Vue全栈开发旅游网项目(8)-接口联调*2+用户登录
  • AI大模型如何重塑软件开发流程?
  • 工商业储能是什么,工商业储能有什么作用?
  • 作为一个前端开发者 以什么步骤学习后端技术
  • electron 设置最小窗口缩放
  • Java | Leetcode Java题解之第542题01矩阵
  • 高频面试题(含笔试高频算法整理)基本总结回顾32
  • RxJava最全面试题及参考答案
  • Linux qt下是使用搜狗輸入發
  • 全网最适合入门的面向对象编程教程:58 Python字符串与序列化-序列化Web对象的定义与实现
  • Android中Activity启动的模式
  • 算法——双指针
  • macOS15.1及以上系统bug:开发者证书无法打开,钥匙串访问无法打开一直出现图标后立马闪退
  • [项目] C++基于多设计模式下的同步异步日志系统
  • 【青牛科技】GC2803:白色家电与安防领域中 ULN2803 的卓越替代者
  • Laravel/Sail 中修改npm源的问题
  • 京津冀自动驾驶技术行业盛会|2025北京自动驾驶技术展会