09-责任链模式-C语言实现

news2024/11/24 2:35:51

责任链模式:Avoid coupling the sender of a request to its receiver by giving more than one object a chance to handle the request.Chain the receiving objects and pass the request along the chain until an object handles it.(使多个对象都有机会处理请求, 从而避免了请求的发送者和接受者之间的耦合关系。 将这些对象连成一条链, 并沿着这条链传递该请求, 直到有对象处理它为止。 )

UML图:


代码实现:

#include <stdio.h>
#include <stdlib.h>

// 定义请求结构体
typedef struct {
    int amount;
} Request;

// 定义处理对象结构体
typedef struct Handler {
    void (*handleRequest)(struct Handler* handler, Request* request);
    struct Handler* nextHandler;
} Handler;

// 处理对象1
void handler1_handleRequest(Handler* handler, Request* request) {
    if (request->amount <= 100) {
        printf("Handler 1 handles the request.\n");
    } else if (handler->nextHandler != NULL) {
        handler->nextHandler->handleRequest(handler->nextHandler, request);
    }
}

// 处理对象2
void handler2_handleRequest(Handler* handler, Request* request) {
    if (request->amount > 100 && request->amount <= 500) {
        printf("Handler 2 handles the request.\n");
    } else if (handler->nextHandler != NULL) {
        handler->nextHandler->handleRequest(handler->nextHandler, request);
    }
}

// 处理对象3
void handler3_handleRequest(Handler* handler, Request* request) {
    if (request->amount > 500) {
        printf("Handler 3 handles the request.\n");
    } else if (handler->nextHandler != NULL) {
        handler->nextHandler->handleRequest(handler->nextHandler, request);
    }
}

int main() {
    // 创建处理对象
    Handler* handler1 = (Handler*)malloc(sizeof(Handler));
    Handler* handler2 = (Handler*)malloc(sizeof(Handler));
    Handler* handler3 = (Handler*)malloc(sizeof(Handler));

    // 设置处理函数和下一个处理对象
    handler1->handleRequest = handler1_handleRequest;
    handler1->nextHandler = handler2;

    handler2->handleRequest = handler2_handleRequest;
    handler2->nextHandler = handler3;

    handler3->handleRequest = handler3_handleRequest;
    handler3->nextHandler = NULL;

    // 创建请求
    Request request1 = {50};
    Request request2 = {200};
    Request request3 = {1000};

    // 处理请求
    handler1->handleRequest(handler1, &request1);
    handler1->handleRequest(handler1, &request2);
    handler1->handleRequest(handler1, &request3);

    // 释放内存
    free(handler1);
    free(handler2);
    free(handler3);

    return 0;
}

此示例实现了一个简单的责任链模式,有三个处理对象(handler1、handler2和handler3),每个处理对象都可以选择处理请求或将其传递给下一个处理对象。每个处理对象都具有一个处理请求的函数指针,并且可以通过nextHandler字段连接到下一个处理对象。

责任链模式的优点:

  1. 解耦:责任链模式使得请求的发送者和接收者之间解耦,发送者无需知道请求将由哪个接收者处理,接收者也无需知道请求的发送者是谁。
  2. 灵活性:可以动态地添加、移除或重新排列处理对象,以满足不同的需求和情况。
  3. 可扩展性:可以很容易地添加新的处理对象,而无需修改现有的代码。

责任链模式的缺点:

  1. 不能保证请求一定会被处理:如果没有合适的处理对象处理请求,请求可能会到达链的末尾而无法得到处理。
  2. 性能影响:由于请求需要通过整个链进行传递,可能会在一些场景下造成性能损失。
  3. 可能导致系统复杂化:当责任链过长或过于复杂时,可能会增加代码的理解和维护难度。

应用场景:

  1. 请求处理:当一个请求需要经过多个处理对象进行处理时,可以使用责任链模式。每个处理对象都有自己的处理逻辑,并可以选择将请求传递给下一个处理对象或者终止处理。

  2. 日志记录:在日志记录系统中,可以使用责任链模式来实现不同级别的日志记录。例如,可以定义一个处理对象链,其中包含了不同级别的日志处理对象,从低级别到高级别。每个处理对象根据自己的级别来判断是否要处理该日志消息。

  3. 身份认证:在身份认证系统中,可以使用责任链模式来验证用户的身份。可以创建一个处理对象链,其中包含了不同的身份验证处理对象,如用户名密码验证、二次验证等。每个处理对象根据自己的验证规则来判断是否通过验证,如果验证失败,则可以选择终止验证或将请求传递给下一个处理对象。

  4. 缓存处理:在缓存系统中,可以使用责任链模式来处理缓存。可以创建一个处理对象链,其中包含了多个缓存处理对象,如本地缓存、分布式缓存等。每个处理对象根据自己的策略来判断是否有缓存可用,如果有,则返回缓存数据,否则将请求传递给下一个处理对象。

  5. 错误处理:在错误处理系统中,可以使用责任链模式来处理不同类型的错误。可以创建一个处理对象链,其中包含了多个错误处理对象,如日志记录、发送错误报告等。每个处理对象根据自己的处理逻辑来判断是否能够处理该错误,如果不能,则将错误传递给下一个处理对象。

  6. 版本号处理

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Qt QRadioButton单选按钮控件

文章目录 1 属性和方法1.1 文本1.2 选中状态1.3 自动排他1.4 信号和槽 2 实例2.1 布局2.2 代码实现 Qt中的单选按钮类是QRadioButton它是一个可以切换选中&#xff08;checked&#xff09;或未选中&#xff08;unchecked&#xff09;状态的单选按钮单选按钮常用在“多选一”的场…

机器学习工程师学习路线图

我的新书《Android App开发入门与实战》已于2020年8月由人民邮电出版社出版&#xff0c;欢迎购买。点击进入详情 机器学习工程&#xff08;MLE&#xff09;是一个快速发展的领域&#xff0c;对熟练专业人员的需求很高。如果您对 MLE 职业感兴趣&#xff0c;路线图可以帮助您培养…

大小论文over,坐等毕业。写点ROS上建图与导航的心得,也不知道对错,欢迎讨论~(对,谨慎阅读,不存在误人子弟哈~.~)

大小论文总算是都搞定了&#xff0c;院审过了送外审了&#xff0c;生死有命富贵在天&#xff0c;希望外审专家大佬们高抬贵手o.O~ 我所理解的建图算法的移植&#xff0c;能不能运行起来&#xff0c;大框架上就是把一棵完整的坐标转换关系的TF树给整理“通顺”&#xff0c;TF&am…

一文搞懂Git版本工具常用的操作命令

简述 Git是一个分布式的版本控制工具,其在使用上要比SVN等版本控制工具稍显复杂。为了便于理解,本文通过图文方式详细介绍Git的使用,以便于快速掌握Git。Git涉及的主要概念和命令如图所示。理解上述概念后,基本可以使用Git完成日常开发工作。关于Git的介绍以及常用命令在之前的…

RK3568驱动指南|第十篇 热插拔-第116章netlink监听广播信息实验

瑞芯微RK3568芯片是一款定位中高端的通用型SOC&#xff0c;采用22nm制程工艺&#xff0c;搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码&#xff0c;支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU&#xff0c;可用于轻量级人工…

CES 2024:AI智能大爆发,引领科技新纪元

美国当地时间1月9日&#xff0c;2024年国际消费类电子产品展览会&#xff08;CES&#xff09;如期在内华达州拉斯维加斯举行。作为全球最盛大的科技盛会&#xff0c;每年&#xff0c;来自世界各地的顶尖科技企业都会参加CES&#xff0c;展示他们的最新科技产品和创新&#xff0…

Python的安装与卸载【Windows系统】

在 Windows 上安装与卸载 Python Python的安装 下载Python 安装Python 下载完后打开安装包 注意最底下的"Add Python 3.8 to Path"&#xff08;将Python加入环境变量&#xff09;一定要勾选&#xff01;&#xff01;&#xff01;这样就可以免去之后环境配置的烦恼…

在本地测试nginx中localhost不行,需要写成127.0.0.1

在Windows 10系统的命令提示符cmd中&#xff0c;执行命令ping localhost&#xff0c;并没有出现我与其的ip地址“127.0.0.1”&#xff0c;而是“[::1]”。 问题原因 在cmd中ping localhost解析出来的是ipv6的::1的原因是windows有个优先解析列表&#xff0c;当ipv6的优先级高于…

【cmu15445c++入门】(4)c++中的模板方法

一、template模板方法 模板方法是c的一个特性&#xff0c;可以让你的代码在不指定数据类型的情况下&#xff0c;运行不同的数据类型。 你可以创建模板方法和模板类&#xff0c;本文讨论模板方法。 二、代码 // Includes std::cout (printing) for demo purposes. #include &…

4S店汽车行业万能通用小程序源码系统:功能强大,集合汽车在线展示+在线预约+贷款计算器......附带完整的搭建教程

在移动互联网高速发展的今天&#xff0c;越来越多的消费者选择通过手机端了解汽车信息、预约试驾、计算贷款等。4S店需要紧跟时代步伐&#xff0c;提供更加便捷、高效的服务。因此&#xff0c;开发一款集合汽车在线展示、在线预约、贷款计算器等多项功能的通用小程序成为市场趋…

数据结构02附录02:哈希表[C++]

图源&#xff1a;文心一言 上机题目练习整理~&#x1f95d;&#x1f95d; 本篇作为线性表的代码补充&#xff0c;每道题提供了优解和暴力解算法&#xff0c;供小伙伴们参考~&#x1f95d;&#x1f95d; 第1版&#xff1a;在力扣新手村刷题的记录&#xff0c;优解是Bard老师提…

语义补全任务2023年论文总结

一、3D Semantic Scene Completion: a Survey 语义场景补全SSC旨在联合估计出一个场景完整的几何和语义信息&#xff0c;假设只需要部分稀疏输入数据。 1、数据集 2、场景表示 Point Cloud&#xff0c;点云是一种方便的、记忆高效的表示方法&#xff0c;它将三维连续世界中的…

网站怎么做google搜索引擎优化?

网站想做google搜索引擎优化&#xff0c;作为大前提&#xff0c;您必须确保网站本身符合google规范&#xff0c;我们不少客户实际上就连这点都无法做到 有不少客户公司自己本身有技术&#xff0c;就自己弄一个网站出来&#xff0c;做网站本身不是难事&#xff0c;但前提是您需要…

OpenShift 4 - 在 OpenShift 上运行物体检测 AI 应用

《OpenShift / RHEL / DevSecOps 汇总目录》 说明&#xff1a;本文已经在 OpenShift 4.14 RHODS 2.5.0 的环境中验证 说明&#xff1a;请先根据《OpenShift 4 - 部署 OpenShift AI 环境&#xff0c;运行 AI/ML 应用&#xff08;视频&#xff09;》一文完成 OpenShift AI 环境…

基于k8s Deployment的弹性扩缩容及滚动发布机制详解

k8s第一个重要设计思想&#xff1a;控制器模式。k8s里第一个控制器模式的完整实现&#xff1a;Deployment。它实现了k8s一大重要功能&#xff1a;Pod的“水平扩展/收缩”&#xff08;horizontal scaling out/in&#xff09;。该功能从PaaS时代开始就是一个平台级项目必备编排能…

Kali改变为中文

更新kali源之后【如果没有更新&#xff0c;可以参考我的Kakli更新源】。 执行下面的命令&#xff1a; # apt-get update && apt-get upgrade && apt-get clean # dpkg-reconfigure locales 如果没有权限&#xff1f;可以通过sudo命令进行授权 1、先取消英文&…

KT6368A双模蓝牙芯片批量生产使用主机芯片KT6358M测试很方便

一、简介 KT6368A双模蓝牙芯片批量生产使用主机芯片测试很方便 KT6368A批量生产怎么办&#xff1f;不可能用手机一个一个的去连吧&#xff0c;太慢了 别慌&#xff0c;这个问题&#xff0c;我们早就考虑清楚了&#xff0c;答案如下&#xff0c;分为两个方法&#xff1a; 详细…

2024数字安全十大技术趋势预测,不容忽视!

2023年是技术爆发的一年&#xff0c;ChatGPT、量子计算、常温超导体争相刷新眼球&#xff1b;2023年是风云变幻的一年&#xff0c;局部战争、网络战、全球经济震荡交替冲击……无数个值得记忆的瞬间&#xff0c;都对网络安全行业产生着深远影响。 通过观察2023年的国际国内环境…

路由器实验总结(静态路由配置)

1、静态路由的配置 R2(config)#int s0/0/0 R2(config)#ip add 192.168.3.2 255.255.255.0 R2(config)# no shut R1(config)#int s0/0/0 R1(config)#ip add 192.168.3.1 255.255.255.0 R1(config)# no shut串口的配置是这样的&#xff0c;静态路由如下&#xff1a; R2(config)#…

项目经理快速晋升应当具备的四个能力

项目的成功与失败都直接压在项目经理的肩上。不论问题的根源在何处&#xff0c;最终承担责任的总是项目经理。身为项目经理&#xff0c;你务必清楚&#xff0c;自己背负的是何等的重任。 1、计划能力 计划是行动的灯塔&#xff0c;若管理者无法制定计划&#xff0c;又如何引…