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

23种设计模式 - 责任链

模式定义

责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,允许多个对象按链式顺序处理请求,直到其中一个对象处理为止。该模式将请求的发送者和接收者解耦,使多个对象都有机会处理请求。


模式结构

抽象处理者(Handler)

  • 定义处理请求的接口(如 handleRequest()
  • 持有下一个处理者的引用(nextHandler
    具体处理者(ConcreteHandler)
  • 实现请求处理逻辑,决定是否处理或传递请求
    客户端(Client)
  • 构建处理链并触发请求

适用场景

多级处理逻辑:数控系统中需要依次执行安全检查、参数校验、运动控制等步骤
动态调整处理流程:运行时灵活调整处理链顺序(如紧急任务跳过某些校验)
解耦请求与处理者:避免请求发送者依赖具体处理对象


C++示例(数控系统场景)

场景说明:
数控系统执行加工任务时需依次通过安全检查、参数校验、运动控制三个环节,任一环节失败则终止流程。

#include 
#include 

// 请求类:加工任务
class MachiningRequest {
public:
    MachiningRequest(int speed, float depth) 
        : speed_(speed), depth_(depth), isSafe_(false), isValid_(false) {}
    
    int speed_;
    float depth_;
    bool isSafe_;
    bool isValid_;
};

// 抽象处理者
class Handler {
protected:
    Handler* nextHandler_;
public:
    Handler() : nextHandler_(nullptr) {}
    virtual ~Handler() = default;
    
    void setNext(Handler* handler) { 
        nextHandler_ = handler; 
    }
    
    virtual void handleRequest(MachiningRequest& request) = 0;
};

// 具体处理者:安全检查
class SafetyCheckHandler : public Handler {
public:
    void handleRequest(MachiningRequest& request) override {
        if (request.speed_ <= 5000 && request.depth_ <= 100.0f) {
            request.isSafe_ = true;
            std::cout << "安全检查通过" << std::endl;
            if (nextHandler_) nextHandler_->handleRequest(request);
        } else {
            std::cout << "安全校验失败:参数超限" << std::endl;
        }
    }
};

// 具体处理者:参数校验
class ParameterValidator : public Handler {
public:
    void handleRequest(MachiningRequest& request) override {
        if (request.speed_ > 0 && request.depth_ > 0) {
            request.isValid_ = true;
            std::cout << "参数校验通过" << std::endl;
            if (nextHandler_) nextHandler_->handleRequest(request);
        } else {
            std::cout << "参数校验失败:非法数值" << std::endl;
        }
    }
};

// 具体处理者:运动控制
class MotionController : public Handler {
public:
    void handleRequest(MachiningRequest& request) override {
        if (request.isSafe_ && request.isValid_) {
            std::cout << "运动控制执行:速度=" << request.speed_ 
                      << "rpm,深度=" << request.depth_ << "mm" << std::endl;
        }
    }
};

int main() {
    // 构建处理链
    Handler* safetyCheck = new SafetyCheckHandler();
    Handler* validator = new ParameterValidator();
    Handler* motionCtrl = new MotionController();
    
    safetyCheck->setNext(validator);
    validator->setNext(motionCtrl);

    // 触发请求
    MachiningRequest task1(2500, 50.0f);
    std::cout << "--- 任务1执行 ---" << std::endl;
    safetyCheck->handleRequest(task1);

    MachiningRequest task2(6000, 150.0f);
    std::cout << "\n--- 任务2执行 ---" << std::endl;
    safetyCheck->handleRequest(task2);

    delete safetyCheck;
    delete validator;
    delete motionCtrl;
    return 0;
}

输出结果

--- 任务1执行 ---
安全检查通过
参数校验通过
运动控制执行:速度=2500rpm,深度=50mm

--- 任务2执行 ---
安全校验失败:参数超限

实现要点

链式传递:每个处理者通过 nextHandler_ 传递请求,形成处理链[
动态扩展:新增处理步骤(如日志记录)只需添加新 ConcreteHandler
终止条件:处理者根据业务逻辑决定是否中断链(如安全检查失败)


模式变体

纯责任链:请求必须被严格处理或传递(如审批流程)
带中断的链:处理完成后可终止传递(如本示例的安全检查)
优先级链:按优先级动态排序处理者(如紧急任务优先处理)

相关文章:

  • 存储结构 分类
  • 使用Swupdate恢复模式更新嵌入式linux系统
  • 大师课程:穿越日本专业级人文风景摄影视频课程 Fstoppers - Photographing the World 6 - Japan II
  • 基于微信小程序的宠物寄养平台的设计与实现(ssm论文源码调试讲解)
  • FPGA VIVADO:axi-lite 从机和主机
  • 环境变量 PATH 与可执行文件识别机制详解
  • 数据倾斜定义以及在Spark中如何处理数据倾斜问题
  • 14. Docker 轻量级可视化工具 Portainer(的详细安装步骤+常规使用详细说明)
  • PyQt加载UI文件
  • x86平台基于Qt+opengl优化ffmpeg软解码1080P视频渲染效率
  • 【GoLang】【算法模板】2、GoLang 算法模板整理
  • Java包装类泛型编程
  • Sa-Token 根据官方文档简单实现登录认证的示例
  • 认识 ADB(Android Debug Bridge,Android SDK 中的一个工具)
  • 排序与算法:插入排序
  • mapbox基础,使用geojson加载line线图层,实现纯色填充、图片填充、虚线和渐变效果
  • 【Qt】Q_OBJECT无法用在模版类中的原因和解决方法
  • GPT-2 大模型
  • 本地部署DeepSeek
  • 提升接口性能之缓存
  • 张广智︱“编年事辑”:打开学人心路历程的窗户
  • 党建评:对违规宴饮等问题要坚决露头就打
  • 人民日报民生观:转人工客服,怎么这么难?
  • 重庆市委原常委、政法委原书记陆克华被决定逮捕
  • 深圳中院回应“退休夫妻月入1.2万负债1.2亿”:其自述因经营不善负债
  • 中保协发布《保险机构适老服务规范》,全面规范保险机构面向老年人提供服务的统一标准