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

 更新时间:2022年01月06日 09:04:56   作者:Hongggggggg  
大家好,本篇文章主要讲的是C语言责任链模式示例代码,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览

介绍:

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

在这里插入图片描述

作用:

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

类比:

​ 公司申请报销,首先要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语言之char*和unsigned char*的区别及说明

    c语言之char*和unsigned char*的区别及说明

    这篇文章主要介绍了c语言之char*和unsigned char*的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • Qt 数据库QSqlDatabase使用示例

    Qt 数据库QSqlDatabase使用示例

    本文主要介绍了Qt数据库QSqlDatabase使用示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-12-12
  • C++结构体作为函数参数传参的实例代码

    C++结构体作为函数参数传参的实例代码

    这篇文章主要介绍了C++结构体作为函数参数传参的实例代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • C语言实现手机电话簿管理系统

    C语言实现手机电话簿管理系统

    这篇文章主要为大家详细介绍了C语言实现手机电话簿管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • C++中vector可以作为map的键值实例代码

    C++中vector可以作为map的键值实例代码

    这篇文章主要介绍了C++中vector可以作为map的键值实例代码,需要的朋友可以参考下
    2017-07-07
  • 编写C++程序使DirectShow进行视频捕捉

    编写C++程序使DirectShow进行视频捕捉

    这篇文章主要介绍了如何编写C++程序来使DirectShow进行视频捕捉的方法,DirectShow是微软公司在ActiveMovie和Video for Windows的基础上推出的新一代基于COM(Component Object Model)的流媒体处理的开发包,要的朋友可以参考下
    2016-03-03
  • C语言实现基于控制台的电子时钟

    C语言实现基于控制台的电子时钟

    这篇文章主要为大家详细介绍了C语言实现基于控制台的电子时钟,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • C语言深入回顾讲解结构体对齐

    C语言深入回顾讲解结构体对齐

    C 数组允许定义可存储相同类型数据项的变量,结构是 C 编程中另一种用户自定义的可用的数据类型,它允许你存储不同类型的数据项,本篇让我们来了解C 的结构体内存对齐
    2022-06-06
  • Qt编写地图迁徙图的实现示例

    Qt编写地图迁徙图的实现示例

    本文主要介绍了Qt编写地图迁徙图的实现示例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12
  • Qt基于TCP实现客户端与服务端的连接

    Qt基于TCP实现客户端与服务端的连接

    这篇文章主要为大家详细介绍了Qt基于TCP实现客户端与服务端的连接,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08

最新评论