博客
关于我
趣谈设计模式 | 职责链模式(ChainOfResposibility):请求的转发处理
阅读量:553 次
发布时间:2019-03-09

本文共 1933 字,大约阅读时间需要 6 分钟。

职责链模式

问题背景

企业每天接收大量信息,包括求职简历、商务合作信息、法律纠纷信息、广告推销等。这些信息需要分发给不同的部门处理,但随着公司规模扩张和部门细化,信息管理变得更加复杂。传统的信息管理员设计存在严重的问题:单一职责原则被违反,开放-封闭原则也面临挑战。

职责链模式的引入

为了应对这些问题,职责链模式被引入。职责链模式通过将多个处理者按链状结构连接,使请求可以沿着链传递,直到找到一个能够处理它的对象,从而避免了发送者与接收者的耦合关系。

职责链模式的实现

职责链模式由以下两个核心要素组成:

  • 处理者接口(Handler):提供了处理请求的统一接口。
  • 具体处理者(ConcreteHandler):实现了特定的处理逻辑,可以访问链表中的下一个处理者。
  • 类示例:

    • LegalHandler:处理法务信息。
    • BusinessHandler:处理商务信息。
    • PersonnelHandler:处理人事信息。
    • MiscellaneousHandler:作为链尾,处理无法分配的信息。

    信息处理流程

    信息从职责链的首节点(如 LegalHandler)开始传递。例如,客户发送的简历会依次经过法律部门、商务部门、人事部门,最终由杂务部门处理。每个部门只处理自己分内的信息,无法处理则将请求转发给下一个部门。

    动态职责分配

    这种设计的优势体现在动态性和灵活性上:

    • 可以自由调整部门之间的关系,甚至拆分或合并部门。
    • 灵活改变信息分级,例如增加普通信息管理者或机密信息管理者。

    代码实现

    代码结构如下:

    struct Request {    string _type;    string _text;};class Handler {    public:        Handler() : _successor(nullptr) {}        ~Handler() = default;        void setSuccessor(Handler* successor) {            _successor = successor;        }        virtual void handleRequest(const Request& req) = 0;    private:        Handler* _successor;};class LegalHandler : public Handler {public:    void handleRequest(const Request& req) override {        if (req._type == "法务信息") {            // 处理法务信息        } else {            if (_successor) {                _successor->handleRequest(req);            }        }    }};class BusinessHandler : public Handler {// 类似 LegalHandler 的结构}// 其他具体处理者类似于上述结构

    测试代码示例:

    int main() {    Handler* legal = new LegalHandler;    Handler* business = new BusinessHandler;    Handler* personnel = new PersonnelHandler;    Handler* miscellaneous = new MiscellaneousHandler;        legal->setSuccessor(business);    business->setSuccessor(personnel);    personnel->setSuccessor(miscellaneous);        // 发送不同类型的请求    legal->handleRequest({ "法务信息", "XXX法院传票" });    // 其他类似请求}

    优势总结

  • 解耦了请求的发送者和接收者。
  • 简化了对象的连接链式结构,使得请求处理过程更加透明。
  • 动态调整职责链,提升系统的灵活性。
  • 适用于多次处理同一类型请求的场景。
  • 应用场景

    适用于:

    • 对多个对象可能处理同一个请求的场景。
    • 动态指定一组对象处理特定请求。
    • 实现拦截器、过滤器等功能。

    通过职责链模式,企业可以更高效地管理信息,避免职责过载,并实现组织架构的动态调整。

    转载地址:http://hdmsz.baihongyu.com/

    你可能感兴趣的文章
    OpenLDAP编译安装及配置
    查看>>
    Openmax IL (二)Android多媒体编解码Component
    查看>>
    OpenMCU(一):STM32F407 FreeRTOS移植
    查看>>
    OpenMCU(三):STM32F103 FreeRTOS移植
    查看>>
    OpenMCU(三):STM32F103 FreeRTOS移植
    查看>>
    OpenMCU(二):GD32E23xx FreeRTOS移植
    查看>>
    OpenMCU(五):STM32F103时钟树初始化分析
    查看>>
    OpenMetadata 命令执行漏洞复现(CVE-2024-28255)
    查看>>
    OpenMMLab | S4模型详解:应对长序列建模的有效方法
    查看>>
    OpenMMLab | 【全网首发】Llama 3 微调项目实践与教程(XTuner 版)
    查看>>
    OpenMMLab | 不是吧?这么好用的开源标注工具,竟然还有人不知道…
    查看>>
    OpenMMLab | 面向多样应用需求,书生·浦语2.5开源超轻量、高性能多种参数版本
    查看>>
    OpenMP 线程互斥锁
    查看>>
    OpenMV入门教程(非常详细)从零基础入门到精通,看完这一篇就够了
    查看>>
    OpenObserve云原生可观测平台本地Docker部署与远程访问实战教程
    查看>>
    openoffice使用总结001---版本匹配问题unknown document format for file: E:\apache-tomcat-8.5.23\webapps\ZcnsDms\
    查看>>
    OpenPPL PPQ量化(2):离线静态量化 源码剖析
    查看>>
    OpenPPL PPQ量化(3):量化计算图的加载和预处理 源码剖析
    查看>>
    OpenPPL PPQ量化(4):计算图的切分和调度 源码剖析
    查看>>
    OpenPPL PPQ量化(5):执行引擎 源码剖析
    查看>>