C語(yǔ)言責(zé)任鏈模式示例代碼
介紹:
? 責(zé)任鏈模式是一種行為模式,它可以允許你將請(qǐng)求沿著處理者鏈進(jìn)行發(fā)送,收到請(qǐng)求以后, 每個(gè)處理者均可對(duì)請(qǐng)求進(jìn)行處理, 或?qū)⑵鋫鬟f給鏈上的下個(gè)處理者;

作用:
將請(qǐng)求按照鏈的方式一一傳遞
類(lèi)比:
? 公司申請(qǐng)報(bào)銷(xiāo),首先要leader審批通過(guò),然后是HR,再然后是財(cái)務(wù),最后是老板,一級(jí)一級(jí)的將請(qǐng)求傳遞;
示例:
#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) //材料齊全就行,不差錢(qián)
{
return PASS;
}
return REFUSE;
}
//審批流程: leader->hr->boss
chain_node_t req_table[] = { {.func = leader}, {.func = hr}, {.func = boss} };
void main(void)
{
/*將審批節(jié)點(diǎn)添加到責(zé)任鏈上*/
for(int i = 0; i < sizeof(req_table) / sizeof(req_table[0]); i++)
{
list_insert_before(&chain_head, &(req_table[i].list));
}
/*報(bào)銷(xiāo)內(nèi)容*/
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)
{
/*報(bào)銷(xiāo)失敗*/
printf("Failed\r\n");
return;
}
}
/*報(bào)銷(xiāo)成功*/
printf("Success\r\n");
return;
}
總結(jié)
到此這篇關(guān)于C語(yǔ)言責(zé)任鏈模式示例代碼的文章就介紹到這了,更多相關(guān)C語(yǔ)言責(zé)任鏈內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語(yǔ)言實(shí)現(xiàn)學(xué)生管理系統(tǒng)總結(jié)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)學(xué)生管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-07-07
C++20 特性 協(xié)程 Coroutines(1)
這篇文章主要給大家分享得是C++20 得特性 協(xié)程 Coroutines,下面文章內(nèi)容我們將來(lái)具體介紹什么是協(xié)程,協(xié)程得好處等知識(shí)點(diǎn),需要的朋友可以參考一下2021-10-10
模擬鼠標(biāo)事件的實(shí)現(xiàn)思路及代碼
這篇文章主要介紹了模擬鼠標(biāo)事件的實(shí)現(xiàn)思路及代碼,有需要的朋友可以參考一下2013-12-12
Opencv 馬賽克和毛玻璃效果與圖片融合的實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了通過(guò)OpenCV實(shí)現(xiàn)馬賽克和毛玻璃濾鏡效果與圖片的融合,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11
C++ 動(dòng)態(tài)數(shù)組模版類(lèi)Vector實(shí)例詳解
這篇文章主要為大家詳細(xì)介紹了C++動(dòng)態(tài)數(shù)組模版類(lèi)Vector實(shí)例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-02-02
C語(yǔ)言中判斷素?cái)?shù)(求素?cái)?shù))的思路與方法實(shí)例
計(jì)算機(jī)或者相關(guān)專(zhuān)業(yè)基本上大一新生開(kāi)始學(xué)編程都會(huì)接觸的一個(gè)問(wèn)題就是判斷質(zhì)數(shù),下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言中判斷素?cái)?shù)(求素?cái)?shù))的思路與方法,需要的朋友可以參考下2022-03-03
淺談C結(jié)構(gòu)和C++結(jié)構(gòu)之間的區(qū)別
這篇文章主要介紹了淺談C結(jié)構(gòu)和C++結(jié)構(gòu)之間的區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04
zlib庫(kù)壓縮和解壓字符串STL string的實(shí)例詳解
這篇文章主要介紹了zlib庫(kù)壓縮和解壓字符串STL string的實(shí)例詳解的相關(guān)資料,希望通過(guò)本文能幫助到大家,需要的朋友可以參考下2017-10-10
聊聊Qt+OpenCV聯(lián)合開(kāi)發(fā)之圖像的創(chuàng)建與賦值問(wèn)題
這篇文章主要介紹了Qt+OpenCV聯(lián)合開(kāi)發(fā)之圖像的創(chuàng)建與賦值問(wèn)題,給大家介紹了圖像的克隆及拷貝問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-01-01

