博客
关于我
趣谈设计模式 | 职责链模式(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/

    你可能感兴趣的文章
    pip3命令全解析:Python3包管理工具的详细使用指南
    查看>>
    pip3安装命令重复创建文件‘/tmp/pip-install-xxxxx/package‘失败
    查看>>
    PIPE 接口信号列表
    查看>>
    pipeline配置与管理Job企业级实战
    查看>>
    pipeline项目配置实战
    查看>>
    Pipenv 与 Conda?
    查看>>
    QVGA/HVGA/WVGA/FWVGA分辨率屏含义及大小//Android虚拟机分辨率
    查看>>
    pipreqs : 无法将“pipreqs”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径 正确,然后再试一次。
    查看>>
    pipy国内镜像的网址
    查看>>
    quiver绘制python语言
    查看>>
    pip下载缓慢
    查看>>
    PIP使用SSH从BitBucket安装自定义软件包,无需输入SSH密码
    查看>>
    pip命令提示unknow or unsupported command install解决方法
    查看>>
    pip在安装模块时提示Read timed out
    查看>>
    pip更换源
    查看>>
    SpringBoot之Banner源码深度分解
    查看>>
    Pix2Pix如何工作?
    查看>>
    QuickBI助你成为分析师——搞定数据源
    查看>>
    pkl来存储python字典
    查看>>
    quick sort | 快速排序 C++ 实现
    查看>>