0

0

责任链模式怎么处理请求 多处理器链式传递机制

P粉602998670

P粉602998670

发布时间:2025-08-19 13:41:01

|

866人浏览过

|

来源于php中文网

原创

责任链模式通过将请求在多个处理器间链式传递,使请求发送者与接收者解耦,每个处理器判断是否处理请求或转发给下一节点,直到请求被处理或链结束;该模式由handler定义处理接口,concretehandler实现具体逻辑,client构建链并发送请求,典型应用场景如审批流程中根据金额由主管、经理或ceo逐级处理,示例中3000元请求由director处理;其核心优势包括松耦合、动态调整链结构、避免冗长条件判断,但也需注意请求可能未被处理的问题,因此建议明确处理器职责边界、控制链长度、防止循环引用,并可在链尾添加默认处理器确保请求必被处理,同时可结合建造者或装饰器模式增强灵活性,适用于审批、过滤、拦截等需多级处理的场景。

责任链模式怎么处理请求 多处理器链式传递机制

责任链模式(Chain of Responsibility Pattern)是一种行为设计模式,它让多个处理器(处理对象)都有机会处理请求,从而解耦请求的发送者和接收者。请求在处理器链中逐级传递,直到某个处理器处理它为止。

责任链如何处理请求

在责任链模式中,每个处理器都持有一个对下一个处理器的引用。当一个请求到来时,第一个处理器判断自己是否能处理,如果不能,就将请求“转发”给下一个处理器。这个过程一直持续,直到有处理器处理该请求,或者请求到达链尾被丢弃。

这种机制实现了“请求发送者”与“具体处理者”之间的解耦,也允许动态地组织处理流程。


多处理器链式传递机制的核心结构

一个典型的责任链包含以下几个部分:

Noya
Noya

让线框图变成高保真设计。

下载
  • Handler(处理器抽象类或接口)
    定义处理请求的方法,以及设置下一个处理器的方法。

  • ConcreteHandler(具体处理器)
    实现处理逻辑。每个具体处理器决定是自己处理请求,还是将请求传递给下一个处理器。

  • Client(客户端)
    创建处理器链,并向链的起始节点发送请求。


处理请求的典型流程

  1. 客户端构造处理器链,例如:A → B → C
  2. 客户端向处理器A发送请求
  3. A 判断是否能处理:
    • 如果能,就处理并结束
    • 如果不能,将请求传递给 B
  4. B 做出同样的判断和处理决策
  5. 依此类推,直到请求被处理或链结束

示例场景:审批流程

假设一个报销审批系统:

  • 报销金额 ≤ 1000:主管审批
  • 1000
  • 金额 > 5000:CEO审批

使用责任链模式可以这样设计:

abstract class Approver {
    protected Approver next;

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

    public abstract void processRequest(ExpenseRequest request);
}

class Manager extends Approver {
    public void processRequest(ExpenseRequest request) {
        if (request.getAmount() <= 1000) {
            System.out.println("Manager approved request of " + request.getAmount());
        } else if (next != null) {
            next.processRequest(request);
        }
    }
}

class Director extends Approver {
    public void processRequest(ExpenseRequest request) {
        if (request.getAmount() <= 5000) {
            System.out.println("Director approved request of " + request.getAmount());
        } else if (next != null) {
            next.processRequest(request);
        }
    }
}

class CEO extends Approver {
    public void processRequest(ExpenseRequest request) {
        System.out.println("CEO approved request of " + request.getAmount());
    }
}

客户端使用:

Approver manager = new Manager();
Approver director = new Director();
Approver ceo = new CEO();

manager.setNext(director);
director.setNext(ceo);

ExpenseRequest req = new ExpenseRequest(3000);
manager.processRequest(req); // Director 处理

链式传递的关键特性

  • 松耦合
    请求发送者不需要知道哪个具体对象会处理请求,只需交给链的头部即可。

  • 动态调整链结构
    可以在运行时添加、删除或调整处理器顺序。

  • 避免条件判断堆叠
    传统方式可能用一长串 if-else 判断谁处理,而责任链用对象链代替了硬编码逻辑。

  • 请求可能未被处理
    如果链尾都无法处理,且没有兜底机制,请求可能被忽略。因此有时需要默认处理器或异常处理。


使用建议与注意事项

  • 明确处理边界
    每个处理器应清楚自己处理的范围,避免重复处理或遗漏。

  • 防止链过长或循环
    链太长会影响性能,注意设置合理的终止条件。避免设置错误导致循环引用。

  • 可选:支持“必须处理”语义
    某些场景下要求请求必须被处理,可以在链尾加一个默认处理器。

  • 结合其他模式使用
    常与建造者模式(构建链)、装饰器模式(增强处理)等结合使用。


基本上就这些。责任链模式通过将请求的处理责任“链式传递”,让系统更灵活、扩展性更强,特别适合审批、过滤、拦截等场景。关键在于合理设计每个处理器的职责边界和传递逻辑。

相关专题

更多
if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

713

2023.08.22

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

989

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

50

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

208

2025.12.29

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

366

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

561

2023.08.10

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

7

2025.12.31

php网站源码教程大全
php网站源码教程大全

本专题整合了php网站源码相关教程,阅读专题下面的文章了解更多详细内容。

4

2025.12.31

视频文件格式
视频文件格式

本专题整合了视频文件格式相关内容,阅读专题下面的文章了解更多详细内容。

7

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Django 教程
Django 教程

共28课时 | 2.6万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.0万人学习

Sass 教程
Sass 教程

共14课时 | 0.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号