2023-7-11-第十六式职责链模式



🍿*★,°*:.☆( ̄▽ ̄)/$:*.°★* 🍿

💥💥💥欢迎来到🤞汤姆🤞的csdn博文💥💥💥
💟💟喜欢的朋友可以关注一下,下次更新不迷路💟💟
😆😆😆私聊获取个人订阅号哦,欢迎订阅共同学习😆😆😆
💖💖💖💖可以加入大家庭群聊,一起学习天天有福利💖💖💖💖





🍬本文摘要

在这里插入图片描述

设计方法二十三式之职责链模式


目录

  • 🍬本文摘要
  • 😉一、基础概念
  • 🐱‍🐉二、职责链模式实现
  • 🎉三、模块之间的关系
  • 🐱‍🚀四、注意事项
  • 🎂五、使用场景
  • 🍳参考文献
  • 🧊文章总结



😉一、基础概念

责任链模式(Chain of Responsibility Pattern)是一种行为设计模式,它允许多个对象按照顺序处理请求,而不需要显式指定接收者。每个处理对象都可以决定是否处理请求以及将请求传递给下一个对象。

在责任链模式中,通常有一个抽象处理器(Handler)作为基类,定义了处理请求的接口方法,并维护一个指向下一个处理器的引用。具体的处理器(Concrete Handler)继承抽象处理器,并实现自己的处理逻辑。每个处理器都能够根据自身的职责决定是否能够处理请求,如果可以,则进行处理,否则将请求传递给下一个处理器。

责任链模式的主要优点包括:

  • 解耦发送者和接收者:发送者无需知道处理请求的具体处理器,只需将请求传递给第一个处理器即可。
  • 可灵活添加或删除处理器:由于处理器之间通过引用链连接,因此可以方便地添加新的处理器或调整处理器的顺序,以满足不同的业务需求。
  • 支持动态组合:可以通过动态配置处理器的顺序和组合关系,实现不同的处理流程。

然而,责任链模式也存在一些注意事项:

  • 请求可能无法被处理:如果所有的处理器都无法处理某个请求,会导致请求没有得到处理,需要避免这种情况的发生。
  • 可能引起性能问题:由于请求会依次经过多个处理器,如果责任链过长或者处理器逻辑复杂,可能会影响性能。

总之,责任链模式非常适合处理具有多个处理环节且每个环节处理逻辑独立的场景,比如请求的处理流程是可变的、需要动态组合的情况下。


🐱‍🐉二、职责链模式实现

以下是一个简单的C++实现示例,展示了如何使用责任链模式:

#include <iostream>

// 抽象处理器
class Handler {
public:
    virtual void setNextHandler(Handler* next) = 0;
    virtual void handleRequest(int request) = 0;
};

// 具体处理器A
class ConcreteHandlerA : public Handler {
private:
    Handler* nextHandler;

public:
    void setNextHandler(Handler* next) override {
        nextHandler = next;
    }

    void handleRequest(int request) override {
        if (request <= 10) {
            std::cout << "ConcreteHandlerA 处理请求 " << request << std::endl;
        } else if (nextHandler != nullptr) {
            nextHandler->handleRequest(request);
        }
    }
};

// 具体处理器B
class ConcreteHandlerB : public Handler {
private:
    Handler* nextHandler;

public:
    void setNextHandler(Handler* next) override {
        nextHandler = next;
    }

    void handleRequest(int request) override {
        if (request > 10 && request <= 20) {
            std::cout << "ConcreteHandlerB 处理请求 " << request << std::endl;
        } else if (nextHandler != nullptr) {
            nextHandler->handleRequest(request);
        }
    }
};

// 具体处理器C
class ConcreteHandlerC : public Handler {
private:
    Handler* nextHandler;

public:
    void setNextHandler(Handler* next) override {
        nextHandler = next;
    }

    void handleRequest(int request) override {
        if (request > 20 && request <= 30) {
            std::cout << "ConcreteHandlerC 处理请求 " << request << std::endl;
        } else if (nextHandler != nullptr) {
            nextHandler->handleRequest(request);
        }
    }
};

int main() {
    // 创建具体处理器对象
    ConcreteHandlerA handlerA;
    ConcreteHandlerB handlerB;
    ConcreteHandlerC handlerC;

    // 设置处理器之间的关系
    handlerA.setNextHandler(&handlerB);
    handlerB.setNextHandler(&handlerC);

    // 发送请求
    handlerA.handleRequest(5);
    handlerA.handleRequest(15);
    handlerA.handleRequest(25);

    return 0;
}

在上述示例中,我们定义了三个具体的处理器(ConcreteHandlerAConcreteHandlerBConcreteHandlerC),它们分别处理不同范围的请求。每个处理器都实现了setNextHandler方法来设置下一个处理器,并实现了handleRequest方法来处理请求或将请求传递给下一个处理器。

main函数中,我们创建了具体处理器对象,并按照顺序设置处理器之间的关系。然后,我们通过调用第一个处理器的handleRequest方法发送请求,整个请求会依次经过处理器链进行处理,直到找到能够处理该请求的处理器,或者到达链的末尾。

运行代码,你将看到输出结果如下:

ConcreteHandlerA 处理请求 5
ConcreteHandlerB 处理请求 15
ConcreteHandlerC 处理请求 25

这个示例展示了职责链模式的基本使用方式。你可以根据具体场景和需求,扩展和定制处理器的逻辑,并设置不同的处理器顺序以满足业务要求。


🎉三、模块之间的关系

在责任链模式中,模块之间的关系可以分为以下几种角色和交互方式:

  1. 抽象处理器(Handler):

    • 定义了处理请求的接口方法。
    • 维护一个指向下一个处理器的引用。
  2. 具体处理器(Concrete Handler):

    • 继承自抽象处理器,并实现处理请求的具体逻辑。
    • 可以决定是否处理请求,如果无法处理,则将请求传递给下一个处理器。
    • 可以设置下一个处理器的引用,建立处理器链。
  3. 请求发送者(Client):

    • 创建处理器对象,并设置它们之间的关系,形成处理器链。
    • 将请求发送给第一个处理器来触发处理链的执行。
  4. 处理器链(Chain of Responsibility):

    • 由多个具体处理器组成的链状结构。
    • 每个处理器负责处理一部分请求,或将请求传递给下一个处理器。
    • 处理器链的顺序通常按照业务逻辑进行设置。

在责任链模式中,请求从发送者开始,经过处理器链的依次处理,直到找到能够处理该请求的处理器。处理器链的顺序是通过设置每个处理器的下一个处理器来建立的。处理器可以根据自身的职责决定是否能够处理请求,并可以选择将请求传递给下一个处理器。

通过这种方式,责任链模式实现了请求发送者和接收者之间的解耦,使得请求的处理流程可以动态调整和扩展。每个处理器都只需要关注自己的业务逻辑,而不需要知道整个处理流程的细节。

总之,责任链模式中的模块之间通过处理器链的方式相互连接,形成一条处理路径。处理器链的建立和处理器之间的交互,使得多个处理器能够协同工作来处理请求,提高系统的灵活性和可扩展性。


🐱‍🚀四、注意事项

在使用责任链模式时,需要注意以下几个事项:

  1. 避免形成循环链:在设置处理器之间的关系时,需要确保不会形成循环链,即一个处理器的下一个处理器不能再回到自身或者前面的处理器。否则,请求可能会陷入无限循环。

  2. 保证请求能够被处理:处理器链中至少应该有一个处理器能够处理请求,否则请求将无法得到处理。因此,在设计和配置处理器链时,需要确保每个请求都能够被正确地处理或传递给下一个处理器。

  3. 不要过度使用责任链:责任链模式适用于一系列相互独立且可变的处理环节,但并不是所有的场景都适合使用责任链模式。如果处理环节之间的耦合度很高,或者处理器之间的顺序和组合关系不常发生变化,那么使用责任链模式可能会增加系统复杂性,不利于维护和理解代码。

  4. 注意性能问题:由于请求经过多个处理器进行处理,如果责任链过长或者处理器逻辑复杂,可能会影响系统的性能。在实际使用中,需要根据具体情况进行评估和测试,以确保责任链模式的性能满足需求。

  5. 合理划分职责:每个处理器应该只关注自己的职责范围内的请求处理,不要将不相关的逻辑放在同一个处理器中。这有助于提高代码的可读性和可维护性。

总之,使用责任链模式时需要注意合理设计处理器链、避免循环链的出现,确保请求能够被正确处理或传递,以及关注性能问题和职责的划分。正确使用责任链模式可以提高系统的灵活性和可扩展性,但也需要根据具体情况进行评估和权衡。


🎂五、使用场景

职责链模式适用于以下场景:

  1. 处理流程具有多个环节:当业务操作需要经过一系列处理环节,每个环节可能由不同的处理器负责处理时,可以使用责任链模式。例如,订单处理系统中的订单审核、支付、发货等环节。

  2. 动态组合和调整处理流程:如果处理流程的组合和顺序需要根据不同情况进行动态调整,责任链模式可以提供灵活性。通过添加、删除或重新排列处理器,可以实现不同的处理流程。

  3. 解耦请求发送者和接收者:使用责任链模式可以解耦请求发送者和具体的处理器,使得发送者无需知道哪个处理器会处理请求。这样可以简化发送者的代码,且方便增加新的处理器。

  4. 多个对象可以处理同一请求:在某些情况下,一个请求可能被多个对象中的一个处理,而不是固定的某个对象。责任链模式允许多个对象按照顺序尝试处理请求,直到找到能够处理的对象。

  5. 避免请求的发送者与接收者之间的耦合:使用责任链模式可以降低请求发送者与接收者之间的耦合度。发送者只需将请求发送给第一个处理器,而不需要关心具体的处理器是谁,从而增加了系统的灵活性和可扩展性。

综上所述,职责链模式适用于处理具有多个环节且每个环节处理逻辑独立、处理流程需要动态组合或调整的场景。它能够提供灵活性、解耦请求发送者和接收者,并支持多个对象处理同一请求的情况。


🍳参考文献

🧊文章总结

提示:这里对文章进行总结:

   本文讲了关于职责链模式的知识。






更多好文推荐

🍸2021-4月Python 机器学习——中文新闻文本标题分类
🍹2021年4月-(计算机网络)小型校园网络模拟搭建,最全最准确版
🍺2022-10-31-基于用户的协同过滤推荐算法实现+MAE+RMSE
🍻2022-11-28-大数据可视化,特征维度大于50
🥂2023-3-9-一篇简短的文章把C++左右值关系讲的透透彻彻

上一篇
End
下一篇

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/36459.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用大型语言模(LLM)构建系统(七):评估1

今天我学习了DeepLearning.AI的 Building Systems with LLM 的在线课程&#xff0c;我想和大家一起分享一下该门课程的一些主要内容。之前我们已经学习了下面这些知识&#xff1a; 使用大型语言模(LLM)构建系统(一)&#xff1a;分类使用大型语言模(LLM)构建系统(二):内容审核、…

CE-Net

一、贡献 (1)提出DAC模块和RMP模块&#xff0c;以捕获更多高级特征并保留更多空间信息 (2)将所提出的DAC模块和RMP模块与编码器-解码器结构集成在一起&#xff0c;用于医学图像分割 二、方法 (b)部分是shortcut mechanism 空洞卷积 公式化为&#xff1a; 空洞率r对应于对输…

Django_测试模块(六)

目录 开始写我们的第一个测试 首先得有个 Bug 创建一个测试来暴露这个 bug 运行测试 修复这个 bug 更全面的测试 测试视图 针对视图的测试 Django 测试工具之 Client 改善视图代码 测试新视图 测试 DetailView 集中管理用例文件 使用Django测试运行器 源码等资料…

【IDEA】IDEA 版 Postman 新版发布,功能强大!

介绍 Restful Fast Request 是 IDEA 版 Postman&#xff0c;它是一个强大的 restful api 工具包插件&#xff0c;可以根据已有的方法帮助您快速生成 url 和 params。Restful Fast Request API 调试工具 API 管理工具 API 搜索工具。它有一个漂亮的界面来完成请求、检查服务…

力扣竞赛勋章 | 排名分数计算脚本

文章目录 力扣竞赛勋章介绍竞赛评分算法脚本&#xff08;本文的重点内容&#xff09;运行结果 代码修改自&#xff1a;https://leetcode.cn/circle/discuss/6gnvEj/ 原帖子的代码无法正常运行。 力扣竞赛勋章介绍 https://leetcode.cn/circle/discuss/0fKGDu/ 如果你想知道自…

宝塔 安装/使用/备份数据 Jenkins-图文小白教程

一、Jenkins包下载 大家可以从Jenkins官网&#xff08;https://www.jenkins.io/&#xff09;根据自己的需要下载最新的版本。 但Jenkins官网下载较慢&#xff0c;容易造成下载失败。可以去国内的开源镜像网站下载Jenkins最新版本。目前博主使用的是清华大学的开源镜像网站&…

【youcans动手学模型】SENet 模型及 PyTorch 实现

欢迎关注『youcans动手学模型』系列 本专栏内容和资源同步到 GitHub/youcans 【youcans动手学模型】SENet 模型 【经典模型】SENet 模型-Cifar10图像分类1. SENet 卷积神经网络模型1.1 模型简介1.2 论文介绍1.3 分析与讨论 2. 在 PyTorch 中定义 SENet 模型类2.1 定义 SE Block…

【ElasticSearch】JavaRestClient实现索引库和文档的增删改查

文章目录 一、RestClient1、什么是RestClient2、导入demo工程3、数据结构分析与索引库创建4、初始化JavaRestClient 二、RestClient操作索引库1、创建索引库2、删除索引库3、判断索引库是否存在 三、RestClient操作文档1、新增文档2、查询文档3、修改文档4、删除文档5、批量导入…

Linux之CentOS_7.9卸载MySQL_5.7全过程实操手册

前言&#xff1a;接以上&#xff0c;前面记录了Windows和Linux环境的MySQL部署&#xff0c;那我们既然都部署完成验证测试那就来个卸载记录吧&#xff0c;便于闭环收尾。 环境&#xff1a; 1、CentOS-7.9-x86_64-DVD-2009.iso 2、MySQL-5.7.42-linux-glibc2.12-x86_641、关闭…

langchain系列1- langchain-ChatGLM

源码阅读 1 服务启动 (demo.queue(concurrency_count3).launch(server_name0.0.0.0,server_port7860,show_apiFalse,shareFalse,inbrowserFalse))这部分代码使用了 Gradio 库提供的两个函数&#xff1a;queue 和 launch。 在这里&#xff0c;demo 是一个 Interface 类的实例…

计算机网络 day3 广播风暴 - VLAN - Trunk

目录 广播风暴&#xff1a; 1.什么是广播风暴&#xff1f; 2.危害&#xff1a; 3.防范 STP生成树协议&#xff1a;(72条消息) 生成树协议 — STP_生成树协议步骤_一下子就醒了的博客-CSDN博客 VLAN&#xff1a; VLAN是什么&#xff1f; VLAN起到的作用&#xff1a; 广…

ChatGPT落地场景探索-数据库与大模型

目录 openGauss介绍 openGauss介绍 数据库与大模型 openGauss介绍 大模型与数据库 大模型为数据库带来的机遇 大模型解决数据库问题的挑战 数据库为大模型带来的价值 大模型大模型的发展趋势 趋势产品&#xff1a;Chat2DB 简介 特性 生产应用&#xff1a;基…

SpringBoot项目模块间通信的两种方式

说明&#xff1a;在微服务架构开发中&#xff0c;一个请求是通过模块之间的互相通信来完成的&#xff0c;如下面这个场景&#xff1a; 创建两个子模块&#xff1a;订单模块&#xff08;端口8081&#xff09;、用户模块&#xff08;端口8082&#xff09;&#xff0c;两个模块之…

设计模式--------行为型模式

行为型模式 行为型模式用于描述程序在运行时复杂的流程控制&#xff0c;即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务&#xff0c;它涉及算法与对象间职责的分配。 行为型模式分为类行为模式和对象行为模式&#xff0c;前者采用继承机制来在类间…

VSCODE VUE3 element-ui plaus 环境搭建

目录 一、VUE 1、安装VUE 2、创建项目 二、Element Plus 1、在项目目录中安装 Element Plus&#xff0c;执行 2、引入element 三、vscode 中运行 1、打开项目文件夹 2、点击debug&#xff0c;运行 1&#xff09;、首次lanch chrome时 2&#xff09;、lanch node.js …

MyCat2介绍以及部署和读写分离/分库分表(MyCat2.0)

一&#xff0c;MyCat入门 1.什么是mycat 官网&#xff1a;http://www.mycat.org.cn/​ mycat是数据库中间件 它可以干什么&#xff1f; 读写分离数据分片&#xff1a;垂直拆分&#xff0c;水平拆分多数据源整合 2.数据库中间件 ​ 中间件&#xff1a;是一类连接软件组件和…

十五、flex弹性元素的样式

目录&#xff1a; 1. 基本布局 2. 弹性元素的属性&#xff1a;flex-grow 3. 弹性元素的属性&#xff1a;flex-shrink 4. 弹性元素的属性&#xff1a;flex-basis 5. flex 统一设置这3个属性&#xff08;常用&#xff09; 6. order 一、基本布局 <style>*{margin: 0;paddin…

Arcgis之Python的Arcpy的点线面对象的创建处理和通过pandas读取txt中的经纬度坐标创建几何对象

前言 本节将介绍点线面对象的创建和处理。创建点对象有三个类&#xff0c;分别是Point、Multipoint、PointGeometry&#xff0c;创建线对象的类为Polyline&#xff0c;创建面对象的类为Polygon。 一、点对象的创建——Point 点对象经常与光标配合使用。点要素将返回单个点对…

抖音seo矩阵系统源码|需求文档编译说明(技术)

1.抖音seo矩阵系统文档开发流程 抖音SEO矩阵指的是一系列通过搜索引擎优化&#xff08;SEO&#xff09;技术和策略来提升抖音账号在搜索结果中排名的方法和工具。在抖音上&#xff0c;用户可以通过搜索关键词来查找与其相关的视频和账号。因此&#xff0c;抖音SEO矩阵的主要目…

Java阶段四Day11

Java阶段四Day11 文章目录 Java阶段四Day11Spring AOPElasticsearch1. 关于各种数据库的使用2. 关系型数据库中的索引3. 安装与启动elasticsearch4. 访问elasticsearch5. 使用elasticsearch分词6. elasticsearch文档的相关概念7. 使用elasticsearch添加数据7.1. 添加文档7.2. 查…