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

    你可能感兴趣的文章
    OK335xS UART device registe hacking
    查看>>
    ok6410内存初始化
    查看>>
    OkDeepLink 使用教程
    查看>>
    OKHTTP
    查看>>
    Okhttp3中设置超时的方法
    查看>>
    Okhttp3添加拦截器后,报错,java.io.IOException: unexpected end of stream on okhttp3.Address
    查看>>
    okhttp3缓存
    查看>>
    Okhttp拦截器
    查看>>
    OkHttp源码解析(构建者模式、责任链模式、主线流程)
    查看>>
    OkHttp透明压缩,收获性能10倍,外加故障一枚
    查看>>
    OKR为什么到今天才突然火了?
    查看>>
    ol3 Demo2 ----地图搜索功能
    查看>>
    OLAP、OLTP的介绍和比较
    查看>>
    OLAP在大数据时代的挑战
    查看>>
    Vue.js 学习总结(12)—— 微前端实践思考与总结
    查看>>
    oldboy.16课
    查看>>
    OLEDB IMEX行数限制的问题
    查看>>
    ollama 如何删除本地模型文件?
    查看>>
    ollama-python-Python快速部署Llama 3等大型语言模型最简单方法
    查看>>
    Ollama怎么启动.gguf 大模型
    查看>>