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

    你可能感兴趣的文章
    OpenCV与AI深度学习 | 使用YOLO11实现区域内目标跟踪
    查看>>
    OpenCV与AI深度学习 | 使用YOLOv8做目标检测、实例分割和图像分类(包含实例操作代码)
    查看>>
    OpenCV与AI深度学习 | 使用单相机对已知物体进行3D位置估计
    查看>>
    OpenCV与AI深度学习 | 十分钟掌握Pytorch搭建神经网络的流程
    查看>>
    OpenCV与AI深度学习 | 基于GAN的零缺陷样本产品表面缺陷检测
    查看>>
    OpenCV与AI深度学习 | 基于OpenCV和深度学习预测年龄和性别
    查看>>
    OpenCV与AI深度学习 | 基于Python和OpenCV将图像转为ASCII艺术效果
    查看>>
    OpenCV与AI深度学习 | 基于PyTorch实现Faster RCNN目标检测
    查看>>
    OpenCV与AI深度学习 | 基于PyTorch语义分割实现洪水识别(数据集 + 源码)
    查看>>
    OpenCV与AI深度学习 | 基于YOLO11的车体部件检测与分割
    查看>>
    OpenCV与AI深度学习 | 基于YOLOv8 + BotSORT实现球员和足球检测与跟踪 (步骤 + 源码)
    查看>>
    OpenCV与AI深度学习 | 基于YOLOv8的停车对齐检测
    查看>>
    OpenCV与AI深度学习 | 基于机器视觉的磁瓦表面缺陷检测方案
    查看>>
    OpenCV与AI深度学习 | 基于深度学习的轮胎缺陷检测系统
    查看>>
    OpenCV与AI深度学习 | 实战 | OpenCV传统方法实现密集圆形分割与计数(详细步骤 + 代码)
    查看>>
    OpenCV与AI深度学习 | 实战 | OpenCV实现扫描文本矫正应用与实现详解(附源码)
    查看>>
    OpenCV与AI深度学习 | 实战 | 使用YOLOv8 Pose实现瑜伽姿势识别
    查看>>
    OpenCV与AI深度学习 | 实战 | 使用YoloV8实例分割识别猪的姿态(含数据集)
    查看>>
    OpenCV与AI深度学习 | 实战 | 基于YoloV5和Mask RCNN实现汽车表面划痕检测(步骤 + 代码)
    查看>>
    OpenCV与AI深度学习 | 干货 | 深度学习模型训练和部署的基本步骤
    查看>>