一. 概述
职责链模式:
使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
二. 举个例子
员工要求加薪
公司的管理者一共有三级:总经理、总监、经理,如果一个员工要求加薪,应该向主管的经理申请,如果加薪的数量在经理的职权内,那么经理可以直接批准,否则将申请上交给总监。总监的处理方式也一样,总经理可以处理所有请求。这就是典型的职责链模式,请求的处理形成了一条链,直到有一个对象处理请求。
结构图如下:
假设:
经理可以处理薪水的范围在:0~500
总监可以处理薪水的范围在:500~1000
总经理可以处理薪水的范围在:1000~2000
则代码如下:
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
#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
#define CONCRETEHANDLEA_H
typedef struct {
const void *_;
void *succ;
} _ConcreteHandleA;
extern const void *ConcreteHandleA;
#endif
concreteHandleA.c
#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
#define CONCRETEHANDLEB_H
typedef struct {
const void *_;
void *succ;
} _ConcreteHandleB;
extern const void *ConcreteHandleB;
#endif
concreteHandleB.c
#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
#define CONCRETEHANDLEC_H
typedef struct {
const void *_;
void *succ;
} _ConcreteHandleC;
extern const void *ConcreteHandleC;
#endif
concreteHandleC.c
#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
#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 "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 "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;
}
图片来源:http://blog.csdn.net/hmsiwtv/article/details/9627307
波比源码 » 职责链模式(C语言实现)
levofloxacin order order levaquin 500mg
dutasteride oral buy celebrex sale ondansetron oral
purchase spironolactone without prescription purchase aldactone pills purchase diflucan without prescription
ampicillin canada order cephalexin 125mg generic erythromycin 500mg without prescription
fildena 50mg pills purchase robaxin cheap robaxin 500mg
buy sildenafil 50mg online sildalis oral purchase estradiol without prescription
lamotrigine 50mg us retin gel us order retin gel online
tadalis us avana 200mg canada order diclofenac 100mg generic
order accutane 40mg online isotretinoin canada buy zithromax generic
prednisone 20mg cost female viagra sildenafil viagra 50mg brand
tadalafil 5mg generika tadalafil kaufen ohne rezept viagra für männer
buy isotretinoin 20mg sale buy amoxicillin online cheap ivermectin 12 mg
order modafinil 100mg generic acetazolamide 250mg sale buy diamox 250mg generic
altace 10mg canada brand clobetasol cost astelin
clonidine us order tiotropium bromide 9 mcg without prescription spiriva price
cheap buspar oxybutynin 5mg us buy ditropan 5mg for sale
terazosin 1mg over the counter terazosin 1mg over the counter azulfidine 500mg cheap
benicar sale buy divalproex 500mg online buy generic acetazolamide 250 mg
purchase prograf buy generic requip 2mg ursodiol 150mg over the counter
buy zyban 150mg cetirizine 5mg brand buy quetiapine 100mg without prescription
order molnupiravir 200 mg generic naproxen 250mg sale order prevacid 30mg generic
naltrexone ca buy revia 50mg for sale order abilify 30mg online cheap
dapsone 100 mg tablet perindopril without prescription perindopril 4mg generic
provera usa buy medroxyprogesterone 5mg without prescription buy periactin 4 mg sale
accutane 10mg for sale order amoxil 250mg order deltasone
nootropil 800mg brand piracetam 800 mg cost buy viagra 100mg generic
zithromax uk prednisolone 5mg tablet buy gabapentin 800mg pills
cialis for women oral cialis 5mg viagra 100mg canada
order furosemide 100mg for sale order doxycycline 200mg oral hydroxychloroquine 400mg
sporanox 100mg generic order tindamax 500mg without prescription buy tindamax sale
glucophage 500mg drug atorvastatin without prescription cialis 10mg brand
viagra 25mg for sale buy sildenafil pill oral lisinopril 2.5mg
purchase linezolid sale black jack online roulette wheel
buy prilosec 20mg without prescription buy generic omeprazole 20mg where can i play poker online
metoprolol order atenolol 50mg ca levitra pill
help with my assignment slots real money ladbrokes uk
cheap custom essay sildenafil over the counter order viagra 50mg
cialis 10mg generic viagra 150 mg viagra 100mg pills
tadalafil 20mg pills online cialis buy viagra online cheap
orlistat oral zovirax usa zovirax canada
baclofen 10mg over the counter buy generic toradol 10mg buy ketorolac for sale
cost zantac 300mg buy generic mobic buy celebrex 100mg pill
buy flomax pills cheap spironolactone aldactone over the counter
tadalafil 10mg without prescription cost tadalafil 20mg order cipro 1000mg
buy flagyl 400mg without prescription order flagyl 200mg generic bactrim for sale online
fluconazole pills purchase diflucan online cheap sildenafil without a doctor’s prescription
cialis walmart sildenafil for men over 50 sildenafil overnight shipping
order cefuroxime 500mg pill ceftin 500mg ca buy robaxin 500mg pills
real online gambling order cialis 40mg pills cialis daily cost
sildenafil 100mg tablets sildenafil india purchase lamictal sale
bonus casino provigil online buy order modafinil 200mg pill
buy generic fildena 100mg buy tamoxifen brand budesonide
order deltasone 20mg pill order minipress for sale order mebendazole sale
tretinoin cream usa buy avanafil sale avanafil 100mg cheap
order generic tadalafil 10mg indocin pills indomethacin 75mg sale
buy terbinafine online order amoxicillin generic amoxicillin 500mg
naproxen 250mg generic naproxen over the counter order lansoprazole 30mg online
actos order online sildenafil next day delivery usa buy viagra 100mg generic
generic singulair buy viagra order viagra 100mg online
cialis 10mg without prescription Buy cialis play poker online free
online casino real money casinos online best no deposit free spins
free blackjack games casino online real money do my research paper
buy custom research papers arava 20mg canada sulfasalazine online
purchase doxycycline generic order albuterol 2mg pill order cleocin generic
buy benicar online benicar 20mg price depakote 500mg price
order mesalamine 800mg pills purchase azelastine generic buy irbesartan 150mg generic
order generic temovate cordarone 100mg drug buy cordarone pill
oral amoxicillin 250mg stromectol 12mg usa ivermectin 500ml
buy pamelor 25 mg pills paroxetine 10mg price paroxetine cost
buy requip 1mg for sale order generic rocaltrol 0.25 mg labetalol online order
buy tadacip 20mg sale purchase tadalafil for sale buy trimox 500mg without prescription
tricor 200mg canada viagra uk viagra 100mg oral
buy nexium 40mg online lasix over the counter furosemide cost
cheap tadalafil sale sildenafil dosage viagra sale
purchase minocycline online cheap minocin drug terazosin medication
generic glucophage 500mg cost glucophage 500mg purchase nolvadex online
buy clomid 100mg sale clomiphene sale prednisolone pills
buy deltasone 20mg generic amoxicillin tablet amoxicillin 250mg cheap
sildenafil 50mg over the counter buy finasteride 5mg pills buy proscar
Thank you for content. Area rugs and online home decor store. Hello Administ . Casibom , Casibom Giriş , Casibom Güncel Giriş , Casibom yeni adres . <a href="https://seowebtasarim.net/casibom/" title="Casibin
buy zofran 8mg for sale bactrim 960mg oral buy bactrim online