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语言实现学生管理系统总结

    C语言实现学生管理系统总结

    这篇文章主要为大家详细介绍了C语言实现学生管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-07-07
  • C++20 特性 协程 Coroutines(1)

    C++20 特性 协程 Coroutines(1)

    这篇文章主要给大家分享得是C++20 得特性 协程 Coroutines,下面文章内容我们将来具体介绍什么是协程,协程得好处等知识点,需要的朋友可以参考一下
    2021-10-10
  • 模拟鼠标事件的实现思路及代码

    模拟鼠标事件的实现思路及代码

    这篇文章主要介绍了模拟鼠标事件的实现思路及代码,有需要的朋友可以参考一下
    2013-12-12
  • Opencv 马赛克和毛玻璃效果与图片融合的实现

    Opencv 马赛克和毛玻璃效果与图片融合的实现

    这篇文章主要为大家详细介绍了通过OpenCV实现马赛克和毛玻璃滤镜效果与图片的融合,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • C++ 动态数组模版类Vector实例详解

    C++ 动态数组模版类Vector实例详解

    这篇文章主要为大家详细介绍了C++动态数组模版类Vector实例,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-02-02
  • C语言中判断素数(求素数)的思路与方法实例

    C语言中判断素数(求素数)的思路与方法实例

    计算机或者相关专业基本上大一新生开始学编程都会接触的一个问题就是判断质数,下面这篇文章主要给大家介绍了关于C语言中判断素数(求素数)的思路与方法,需要的朋友可以参考下
    2022-03-03
  • 浅谈C结构和C++结构之间的区别

    浅谈C结构和C++结构之间的区别

    这篇文章主要介绍了浅谈C结构和C++结构之间的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • C++深入探究不同的继承体系

    C++深入探究不同的继承体系

    继承是C++面向对象编程中的一门。继承是子类继承父类的特征和行为,或者是继承父类得方法,使的子类具有父类得的特性和行为。重写是子类对父类的允许访问的方法实行的过程进行重新编写,返回值和形参都不能改变。就是对原本的父类进行重新编写,但是外部接口不能被重写
    2022-05-05
  • zlib库压缩和解压字符串STL string的实例详解

    zlib库压缩和解压字符串STL string的实例详解

    这篇文章主要介绍了zlib库压缩和解压字符串STL string的实例详解的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下
    2017-10-10
  • 聊聊Qt+OpenCV联合开发之图像的创建与赋值问题

    聊聊Qt+OpenCV联合开发之图像的创建与赋值问题

    这篇文章主要介绍了Qt+OpenCV联合开发之图像的创建与赋值问题,给大家介绍了图像的克隆及拷贝问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-01-01

最新评论