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

    你可能感兴趣的文章
    Objective-C实现Adler32算法(附完整源码)
    查看>>
    Objective-C实现AffineCipher仿射密码算法(附完整源码)
    查看>>
    Objective-C实现all combinations所有组合算法(附完整源码)
    查看>>
    Objective-C实现all permutations所有排列算法(附完整源码)
    查看>>
    Objective-C实现all subsequences所有子序列算法(附完整源码)
    查看>>
    Objective-C实现AlphaNumericalSort字母数字排序算法(附完整源码)
    查看>>
    Objective-C实现alternate disjoint set不相交集算法(附完整源码)
    查看>>
    Objective-C实现An Armstrong number阿姆斯特朗数算法(附完整源码)
    查看>>
    Objective-C实现anagrams字谜算法(附完整源码)
    查看>>
    Objective-C实现ApproximationMonteCarlo蒙特卡洛方法计算pi值算法 (附完整源码)
    查看>>
    Objective-C实现area under curve曲线下面积算法(附完整源码)
    查看>>
    Objective-C实现arithmetic算术算法(附完整源码)
    查看>>
    Objective-C实现armstrong numbers阿姆斯壮数算法(附完整源码)
    查看>>
    Objective-C实现articulation-points(关键点)(割点)算法(附完整源码)
    查看>>
    Objective-C实现atoi函数功能(附完整源码)
    查看>>
    Objective-C实现average absolute deviation平均绝对偏差算法(附完整源码)
    查看>>
    Objective-C实现average mean平均数算法(附完整源码)
    查看>>
    Objective-C实现average median平均中位数算法(附完整源码)
    查看>>
    Objective-C实现average mode平均模式算法(附完整源码)
    查看>>
    Objective-C实现avl 树算法(附完整源码)
    查看>>