多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國(guó)內(nèi)最全I(xiàn)T社區(qū)平臺(tái) 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當(dāng)前位置:首頁(yè) > php開(kāi)源 > php教程 > 職責(zé)鏈模式(C語(yǔ)言實(shí)現(xiàn))

職責(zé)鏈模式(C語(yǔ)言實(shí)現(xiàn))

來(lái)源:程序員人生   發(fā)布時(shí)間:2014-10-02 08:00:01 閱讀次數(shù):2585次

一. 概述

職責(zé)鏈模式:

使多個(gè)對(duì)象都有機(jī)會(huì)處理請(qǐng)求,從而避免請(qǐng)求的發(fā)送者和接收者之間的耦合關(guān)系。將這些對(duì)象連成一條鏈,并沿著這條鏈傳遞該請(qǐng)求,直到有一個(gè)對(duì)象處理它為止。

二. 舉個(gè)例子

員工要求加薪

公司的管理者一共有三級(jí):總經(jīng)理、總監(jiān)、經(jīng)理,如果一個(gè)員工要求加薪,應(yīng)該向主管的經(jīng)理申請(qǐng),如果加薪的數(shù)量在經(jīng)理的職權(quán)內(nèi),那么經(jīng)理可以直接批準(zhǔn),否則將申請(qǐng)上交給總監(jiān)??偙O(jiān)的處理方式也一樣,總經(jīng)理可以處理所有請(qǐng)求。這就是典型的職責(zé)鏈模式,請(qǐng)求的處理形成了一條鏈,直到有一個(gè)對(duì)象處理請(qǐng)求。

結(jié)構(gòu)圖如下:

假設(shè):

經(jīng)理可以處理薪水的范圍在:0~500
總監(jiān)可以處理薪水的范圍在:500~1000
總經(jīng)理可以處理薪水的范圍在:1000~2000

則代碼如下:


abstractClass.h

#ifndef ABSTRACTCLASS_H #define ABSTRACTCLASS_H #include <stdlib.h> #include <stdarg.h> typedef struct { size_t size; void* (*ctor)(void *_self, va_list *params); void* (*dtor)(void *_self); } AbstractClass; #endif

handle.h

#ifndef HANDLE_H #define HANDLE_H #include <stdlib.h> #include <stdarg.h> typedef struct { size_t size; void* (*ctor)(void *_self, va_list *params); void* (*dtor)(void *_self); void (*setSuccessor)(void *_self, void *succ); void *(*getSuccessor)(const void *_self); void (*handleRequest)(const void *_self, int request); } Handle; #endif

concreteHandleA.h

#ifndef CONCRETEHANDLEA_H #define CONCRETEHANDLEA_H typedef struct { const void *_; void *succ; } _ConcreteHandleA; extern const void *ConcreteHandleA; #endif

concreteHandleA.c

#include "handle.h" #include "concreteHandleA.h" #include <stdlib.h> #include <stdio.h> static void *concreteHandleACtor(void *_self, va_list *params) { _ConcreteHandleA *self = _self; return self; } static void *concreteHandleADtor(void *_self) { _ConcreteHandleA *self = _self; self->succ = NULL; return self; } static void concreteHandleASetSuccessor(void *_self, void *_succ) { _ConcreteHandleA *self = _self; self->succ = _succ; } static void *concreteHandleAGetSuccessor(const void *_self) { const _ConcreteHandleA *self = _self; return self->succ; } static void concreteHandleAhandleRequest(const void *_self, int request) { if (request >= 0 && request < 500) { fprintf(stdout, "ConcreteHandleA deal with: %d ", request); } else if (concreteHandleAGetSuccessor(_self) != NULL) { const Handle * const *succ = concreteHandleAGetSuccessor(_self); (*succ)->handleRequest(succ, request); } else { fprintf(stderr, "Can't deal with: %d ", request); } } static const Handle _concreteHandleA = { sizeof(_ConcreteHandleA), concreteHandleACtor, concreteHandleADtor, concreteHandleASetSuccessor, concreteHandleAGetSuccessor, concreteHandleAhandleRequest }; const void *ConcreteHandleA = &_concreteHandleA;
concreteHandleB.h

#ifndef CONCRETEHANDLEB_H #define CONCRETEHANDLEB_H typedef struct { const void *_; void *succ; } _ConcreteHandleB; extern const void *ConcreteHandleB; #endif

concreteHandleB.c

#include "handle.h" #include "concreteHandleB.h" #include <stdlib.h> #include <stdio.h> static void *concreteHandleBCtor(void *_self, va_list *params) { _ConcreteHandleB *self = _self; return self; } static void *concreteHandleBDtor(void *_self) { _ConcreteHandleB *self = _self; self->succ = NULL; return self; } static void concreteHandleBSetSuccessor(void *_self, void *_succ) { _ConcreteHandleB *self = _self; self->succ = _succ; } static void *concreteHandleBGetSuccessor(const void *_self) { const _ConcreteHandleB *self = _self; return self->succ; } static void concreteHandleBhandleRequest(const void *_self, int request) { if (request >= 500 && request < 1000) { fprintf(stdout, "ConcreteHandleB deal with: %d ", request); } else if (concreteHandleBGetSuccessor(_self) != NULL) { const Handle * const *succ = concreteHandleBGetSuccessor(_self); (*succ)->handleRequest(succ, request); } else { fprintf(stderr, "Can't deal with: %d ", request); } } static const Handle _concreteHandleB = { sizeof(_ConcreteHandleB), concreteHandleBCtor, concreteHandleBDtor, concreteHandleBSetSuccessor, concreteHandleBGetSuccessor, concreteHandleBhandleRequest }; const void *ConcreteHandleB = &_concreteHandleB;

concreteHandleC.h

#ifndef CONCRETEHANDLEC_H #define CONCRETEHANDLEC_H typedef struct { const void *_; void *succ; } _ConcreteHandleC; extern const void *ConcreteHandleC; #endif

concreteHandleC.c

#include "handle.h" #include "concreteHandleC.h" #include <stdlib.h> #include <stdio.h> static void *concreteHandleCCtor(void *_self, va_list *params) { _ConcreteHandleC *self = _self; return self; } static void *concreteHandleCDtor(void *_self) { _ConcreteHandleC *self = _self; self->succ = NULL; return self; } static void concreteHandleCSetSuccessor(void *_self, void *_succ) { _ConcreteHandleC *self = _self; self->succ = _succ; } static void *concreteHandleCGetSuccessor(const void *_self) { const _ConcreteHandleC *self = _self; return self->succ; } static void concreteHandleChandleRequest(const void *_self, int request) { if (request >= 1000 && request < 2000) { fprintf(stdout, "ConcreteHandleC deal with: %d ", request); } else if (concreteHandleCGetSuccessor(_self) != NULL) { const Handle * const *succ = concreteHandleCGetSuccessor(_self); (*succ)->handleRequest(succ, request); } else { fprintf(stderr, "Can't deal with: %d ", request); } } static const Handle _concreteHandleC = { sizeof(_ConcreteHandleC), concreteHandleCCtor, concreteHandleCDtor, concreteHandleCSetSuccessor, concreteHandleCGetSuccessor, concreteHandleChandleRequest }; const void *ConcreteHandleC = &_concreteHandleC;

new.h

#ifndef NEW_H #define NEW_H void *New(const void *_class, ...); void Delete(void *_class); void SetSuccessor(void *_handle, void *_succ); void HandleRequest(void *_handle, int request); #endif

new.c

#include "new.h" #include "abstractClass.h" #include "handle.h" #include <stdarg.h> #include <stdlib.h> #include <assert.h> #include <stdio.h> void *New(const void *_class, ...) { const AbstractClass *class = _class; void *p = calloc(1, class->size); assert(p); *(const AbstractClass **)p = class; if (class->ctor) { va_list params; va_start(params, _class); p = class->ctor(p, ¶ms); va_end(params); } return p; } void Delete(void *_class) { const AbstractClass **class = _class; if (_class && *class && (*class)->dtor) { _class = (*class)->dtor(_class); } free(_class); } void SetSuccessor(void *_handle, void *_succ) { Handle **handle = _handle; if (_handle && *handle && (*handle)->setSuccessor) { (*handle)->setSuccessor(_handle, _succ); } } void HandleRequest(void *_handle, int request) { Handle **handle = _handle; if (_handle && *handle && (*handle)->handleRequest) { (*handle)->handleRequest(_handle, request); } }

main.c

#include "new.h" #include "concreteHandleA.h" #include "concreteHandleB.h" #include "concreteHandleC.h" int main(int argc, char *argv[]) { void *h1 = New(ConcreteHandleA); void *h2 = New(ConcreteHandleB); void *h3 = New(ConcreteHandleC); SetSuccessor(h1, h2); SetSuccessor(h2, h3); HandleRequest(h1, 300); HandleRequest(h1, 600); HandleRequest(h1, 1500); HandleRequest(h1, 3000); Delete(h1); Delete(h2); Delete(h3); return 0; }


圖片來(lái)源:http://blog.csdn.net/hmsiwtv/article/details/9627307

生活不易,碼農(nóng)辛苦
如果您覺(jué)得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 国产高清一区 | 国产一级做a爰片久久毛片 国产一级做a爰片久久毛片99 | 成年人小视频在线观看 | 性xxxxfreexxxxvideo| 欧美日韩国产片 | 日本aa大片在线播放免费看 | 麻豆日韩区久久综合 | 久久综合九色综合欧洲色 | 亚洲天堂国产精品 | 亚洲十欧美十日韩十国产 | 2022在线精品视频网站 | 欧美jizz8性欧美18 | 最新日本一级中文字幕 | 欧美一区二区三 | 亚洲黄色一区 | 肉视频在线观看 | 午夜影院免费看 | 久久精品国产线看观看亚洲 | 最新欧洲大片免费在线看 | 国内精品欧美久久精品 | 网友自拍区一区二区三区 | 欧美最猛性xxxxx(亚洲精品) | 亚洲国产精品久久久久久网站 | 牛牛精品国内免费一区 | 亚洲欧美国产另类视频 | 欧美成人免费在线 | 亚洲成a人片777777久久 | videosfree性欧美另类 | 日本免费高清视频二区 | 青青青青爽极品在线视频 | 亚洲精品永久免费 | 中文字幕欧美激情 | 福利片免费一区二区三区 | 久久国产精品久久国产精品 | 久久99精品久久久久久黑人 | 亚洲欧美日韩专区 | 免费伦理片在线观看 | 欧美videos黑人巨大 | 在线国产中文字幕 | 色综合小说网 | 亚洲精品第一综合99久久 |