C语言实现设计模式之行为模式:责任链模式

行为模式主要用于解决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);
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值