C语言责任链模式示例代码

Phaedra ·
更新时间:2024-09-21
· 1860 次阅读

目录

介绍:

作用:

类比:

示例:

总结

介绍:

责任链模式是一种行为模式,它可以允许你将请求沿着处理者链进行发送,收到请求以后, 每个处理者均可对请求进行处理, 或将其传递给链上的下个处理者;

作用:

将请求按照链的方式一一传递

类比:

​ 公司申请报销,首先要leader审批通过,然后是HR,再然后是财务,最后是老板,一级一级的将请求传递;

示例: #include <stdio.h> #include <assert.h> #include "list.h" static LIST_HEAD(chain_head); enum { PASS, REFUSE, }; typedef struct { int money; char* files; } info_t; typedef int (*request_handle)(info_t* info); typedef struct { request_handle func; ListObj list; }chain_node_t; int leader(info_t* info) { assert(info != NULL); if(info->money < 1000) //金额小于1000就行 { return PASS; } return REFUSE; } int hr(info_t* info) { assert(info != NULL); if(info->money < 2000 && info->files != NULL) //金额小于2000且材料齐全 { return PASS; } return REFUSE; } int boss(info_t* info) { assert(info != NULL); if(info->files != NULL) //材料齐全就行,不差钱 { return PASS; } return REFUSE; } //审批流程: leader->hr->boss chain_node_t req_table[] = { {.func = leader}, {.func = hr}, {.func = boss} }; void main(void) { /*将审批节点添加到责任链上*/ for(int i = 0; i < sizeof(req_table) / sizeof(req_table[0]); i++) { list_insert_before(&chain_head, &(req_table[i].list)); } /*报销内容*/ info_t info = {.money = 900, .files = "files"}; ListObj *node; list_for_each(node, &chain_head) { chain_node_t* req = list_entry(node, chain_node_t, list); if(req->func(&info) != PASS) { /*报销失败*/ printf("Failed\r\n"); return; } } /*报销成功*/ printf("Success\r\n"); return; } 总结

到此这篇关于C语言责任链模式示例代码的文章就介绍到这了,更多相关C语言责任链内容请搜索软件开发网以前的文章或继续浏览下面的相关文章希望大家以后多多支持软件开发网!



责任链模式 示例 C语言

需要 登录 后方可回复, 如果你还没有账号请 注册新账号