行为模式主要用于解决if--else过多的问题
责任链模式一般用于输出仅与本次输入有关,与以前的输入无关。
同样的输入要经历不同的处理步骤,且处理的步骤,顺序可能会经常性调整。
例如:审批过程
1.一般结构
#ifndef REQUEST_H
#define REQUEST_H
typedef struct{
...
}Request;
void handleRequest(Request *r);
#endif
#include"request.h"
void handleRequst(Request *r){
if(condition1){
...
}else if(condition2){
}
...
else if(conditionN){
}
}
/******************client.c*************************/
void main(){
...
handle(request);
}
改变顺序怎么办?添加了处理怎么办?
2.采用责任链模式
/*v1.0*/
/*******************request.h*********************************/
#ifndef REQUEST_H
typedef struct{
...
}Request;
typedef enum{Responsor1=0,...,ResponsorN}Responsor;
void handle(Request r,Responsor *list);
#endif
/*v1.0*/
#include"request.h"
typedef int (*Handler)(Request *);
static int handler1(Request *r){
if(condition1){//这部分内容也可以抽出来
//TODO
...
return 1;//表示已经被执行,继任者不需要执行
}
return 0;
}
...
static int handlerN(reqRequest *r){
if(conditionN){
//TODO
...
return 1;
}
return 0;
}
/*************************************************/
static Handler myHandlers[]={
handler1,
...
handlerN
};
/************************************************/
void handle(Request r,Responsor *list){//责任链执行
Handler h;
while(*list){
if(myHandlers[*list]){
break;
}
list++;
}
}
/******************client.c*************************/
#include "request.h"
void main(){
Responsor myList[]={//责任链,必须建立
Responsor1,
...
ResponsorN,
0
};
...
Handler list[]={...};
handle(request,myList);
}