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

责任链模式: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. 版本号处理

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

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

相关文章

基于ssm文化遗产的保护与旅游开发论文

摘 要 信息数据从传统到当代&#xff0c;是一直在变革当中&#xff0c;突如其来的互联网让传统的信息管理看到了革命性的曙光&#xff0c;因为传统信息管理从时效性&#xff0c;还是安全性&#xff0c;还是可操作性等各个方面来讲&#xff0c;遇到了互联网时代才发现能补上自古…

适合游泳的骨传导耳机,推荐四款高质量游泳耳机!

游泳是一项全身性的运动&#xff0c;对于锻炼身体和塑形都很有帮助&#xff0c;但是游泳的时候往往会因为水的阻力而感到动作笨拙&#xff0c;同时也会感到枯燥无味。而一款好的游泳耳机则能够让你在游泳的过程中享受音乐或者其他的音频内容&#xff0c;增加游泳的趣味性&#…

chrony 时间同步

一.chrony简介 chrony 的优势&#xff1a; ① 更快的同步&#xff0c;从而最大程度减少了时间和频率误差&#xff0c;对于并非全天 24 小时运行的虚拟计算机而言非常有用。 相对于NTP来说&#xff0c;chrony性能更好 NTP是网络时间协议(Network Time Protocol)&#xff0c;它…

十大开放式耳机品牌哪个好?开放式耳机详细评测攻略分享,精华篇

相信很多朋友在选购开放式耳机的时候&#xff0c;发现市场上的开放式耳机品牌琳琅满目&#xff0c;完全不清楚哪家的产品更胜一筹&#xff0c;有些人甚至跟风购入&#xff0c;因此很容易买到不合适自己的而踩雷。 其实这种耳机我很早之前就有在使用&#xff0c;我对于耳机数码类…

Idea中web项目一些配置问题

1. 产生原因 我从github上clone项目下来后发现idea的一些配置没有带下来需要自己配, 这花了我很多时间, 所以这里总结一下。 2. 具体配置 首先是利用idea进行clone操作 将对应仓库的ssh链接拷贝到此处即可 完成后项目就被clone到了本地, 下面进入正式配置 首先选择所要使用…

查看navicat链接密码

导出链接,带密码导出 ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/239bcf0ad22d4de98524fa4d7db4a30d.png 查看密码 这个是navicat加密后的密码&#xff0c;需要解密 使用一段代码解密 这个是php代码&#xff0c;没有本地php环境&#xff0c;可以看在线…

java项目之基于个人需求和地域特色的外卖推荐系统(ssm)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的闲一品交易平台。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 管理员&#xff1a;管理员…

超低温冰箱,还在人工监测?教你一招完成,超级简单!

随着科技的不断进步&#xff0c;超低温冰箱在医疗、科研、生物制药等领域的应用日益广泛。超低温环境对储存和保护生物样本、药品等具有特殊的要求&#xff0c;因此超低温冰箱监控系统变得至关重要。 客户案例 医疗实验室 河南某大型医疗实验室使用超低温冰箱存储各种生物样本…

服务端性能测试——性能测试工具JMeter-L1

第一遍没学懂&#xff0c;后续文章会更新~ 目录&#xff1a; 1.JMeter介绍与安装Meter简介JMeter安装2.JMeter的运行JMeter运行、界面功能简介3.使用代理服务器录制请求录制压测脚本&#xff08;一&#xff09;Web端脚本录制方法4.测试计划5.线程组6.控制器7.JMeter采样器/取…

高通rb5的fastboot设备识别不了及驱动安装问题

Android fastboot驱动无法安装和识别问题-CSDN博客 以上为转载出处。

已设定选项 ‘readonly‘ (请加 ! 强制执行)

这是vim编辑器报的错误&#xff0c;相信很多人都遇到过。在使用vi编辑一个需要sudo权限的文件后&#xff0c;保存的时候出现这样的错误。这个时候很多人做的事情可能就是不保存退出&#xff08;敲命令:q!&#xff09;&#xff0c;然后再以sudo vi打开文件重新编辑一次。如果恰巧…

既然所有ERP系统都很烂,那创业公司有没有机会?

既然所有ERP系统都烂,那创业公司有没机会? 得一点点把这问题捋顺了再回答—— 先说说“都很烂”这个判断是否准确谈谈国产ERP和国际ERP厂商&#xff0c;新创公司是否有优势&#xff1f;最后聊一下创业本身&#xff0c;如何创业、风险如何…… 一些人可能对传统的ERP系统感到…

领域驱动模型之各层实体严格分层处理

为什么要分层处理呢&#xff1f; 在领域驱动模型中&#xff0c;分为应用层&#xff08;application&#xff09;、领域层&#xff08;domain&#xff09;、基础设施层&#xff08;infrastructure&#xff09;。各层只能处理和访问自己所属层的 entity 或者 dto 对象&#xff0…

态势研判能力再获“赞” | 安全狗连续3年获得中国网络空间安全协会感谢

在2024年的新年伊始&#xff0c;安全狗依托在2023年期间协助中国网络空间安全协会完成《网络安全态势感知研判分析报告》并支持相关网络安全态势研判工作而获得感谢信。 厦门服云信息科技有限公司&#xff08;品牌名&#xff1a;安全狗&#xff09;创办于2013年&#xff0c;是国…

IPv6路由协议---IPv6动态路由(OSPFv3-7)

OSPFv3和OSPFv2协议比较 1.不同点 (1)OSPFv3基于链路运行,不是基于IP子网运行。 OSPFv3运行在IPv6协议上,IPv6是基于链路而不是基于网段运行。这样,在配置OSPFv3时,不需要考虑是否配置在同一网段,只要在同一链路,就可以不配置IPv6全局地址而直接建立联系。 (2)OS…

JDBC初体验(二)

一、SQL注入 1.1 SQL注入原理 利用现有应用程序&#xff0c;将&#xff08;恶意的&#xff09;SQL命令注入到后台数据库引擎执行的能力&#xff0c;它可以通过在web表单中输入&#xff08;恶意的&#xff09;SQL语句得到一个存在安全漏洞的网站上的数据库&#xff0c;而不是按…

S1-01 FreeRTOS

什么是FreeRTOS FreeRTOS是一个迷你的实时操作系统内核。作为一个轻量级的操作系统&#xff0c;功能包括&#xff1a;任务管理、时间管理、信号量、消息队列、内存管理、记录功能、软件定时器、协程等&#xff0c;可基本满足较小系统的需要。 由于RTOS需占用一定的系统资源(尤…

11Spring IoC注解式开发(下)(负责注入的注解/)

1负责注入的注解 负责注入的注解&#xff0c;常见的包括四个&#xff1a; ValueAutowiredQualifierResource 1.1 Value 当属性的类型是简单类型时&#xff0c;可以使用Value注解进行注入。Value注解可以出现在属性上、setter方法上、以及构造方法的形参上, 方便起见,一般直…

虚拟主机 如何上传大于100M的文件 php网站程序

问题 虚拟主机上传文件大小限制100m&#xff0c; 有时会遇到非常大的文件上传&#xff0c;上传过程中耗时非常久&#xff0c; 可能服务器的限制设置了上传文件尺寸&#xff0c;返回“413 request entity too large” 整体逻辑 前端&#xff1a;上传文件时&#xff0c;进行文…

高精度彩色3D相机:开启崭新的彩色3D成像时代

3D成像的新时代 近年来&#xff0c;机器人技术的快速发展促使对3D相机技术的需求不断增加&#xff0c;原因在于&#xff0c;相机在提高机器人的性能和实现多种功能方面发挥了决定性作用。然而&#xff0c;其中许多应用所需的解决方案更复杂&#xff0c;仅提供环境的深度信息是…