欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-01-09 11:31:00
目录介绍:作用:类比:示例:总结介绍:​ 责任链模式是一种行为模式,它可以允许你将请求沿着处理者链进行发送,收到请求以后, 每个处理者均可对请求进行处理, 或将其传递给链上的下个处理者;作用:将请求按...

介绍:

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

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语言 责任链