C语言实现责任链

来源:互联网 发布:js判断是否为json对象 编辑:程序博客网 时间:2024/06/05 12:18
这两天看了Java设计模式里面的责任链。
责任链的思想:
在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链,请求在这个链上传递,直到链上的某一个对象决定处理此请求,发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织链和分配责任。
责任链模式(Chain of Responsibility)的目标是使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止。

于是在这种思想的作怪下, 我想用C语言来实现责任链。。
Java是面向对象的,所以用起责任链来很好用,因为可以继承、多态、类等。如果我们用C语言来实现责任链。怎么实现。C语言没有类。。有的只是一堆函数。其实想想,这样的责任链其实就是C语言里面的函数调用。

函数A调用函数b,函数b调用函数C....等。但是这样写完的函数递归调用 没法扩展,即我希望在处理链条的末尾加上一个新的处理函数函数,这个时候我们就需要修改链条末尾函数的代码。如果不想,我们该怎么设计呢。


我的想法:
首先建一个结构体
struct Handle
{
unsigned long HandleAddress;
struct Handle *Next;
}
struct HandleChain
{
int HandleNum;
struct Handle *Head;
}
很简单,我想设计一个链表。 里面存放函数指针。
定义四个示例函数,doChain是最重要的函数。
typedef void (*FunType)(void *,struct HandleChain*);


void doChain(void *pData,struct HandleChain *pChain)
{
int i = pChain->HandleNum,j;
struct Handle *p = pChain->Head;
while(p)
{
j++;
if(i == j)
break;
p = p->Next;
}
if(i != j)
return;
pChain->HandleNum ++;
((FunType)(p->HandleAddress))(pData,pChain);
}
void A(void *pData,struct HandleChain *pChain)
{
//......处理逻辑A
doChain(pData,pChain);
//...处理逻辑A
}


void B(void *pData,struct HandleChain *pChain)
{
//......处理逻辑B
doChain(pData,pChain);
//...处理逻辑B
}
void C(void *pData,struct HandleChain *pChain)
{
//......处理逻辑C
doChain(pData,pChain);
//...处理逻辑C
}


然后我们初始化 链条
struct HandleChain MyChain ;
struct Handle handleA,handleB,handleC;
handleA.HandleAddress = (unsigned long)A;
handleA.Next = &handleB;
handleB.HandleAddress = (unsigned long)B;
handleB.Next = &handleC;
handleC.HandleAddress = (unsigned long)C;
handleC.Next = 0 ;
MyChain.HandleNum = 1;
MyChain.Head = &handleA;
//调用链条
doChain(pData,&MyChain);


这个时候如果我想新加一个函数,我只要改变MyChain这个链条,在后面加上该函数地址就行了。

如:

void D(void *pData,struct HandleChain *pChain)

{

//....处理逻辑D

doChain(pData,pChain);

//。。。

}

我们只需在Chain里面的handleC指向D就行了。

问题又随之而来。我们知道C语言程序,编译连接完后,就是一个exe文件。如果我们需要改变Handle函数的执行顺序,或者加上另外一个Handle,这个时候我们就必须改变源程序,然后编译连接。

如果,我想对这些处理函数的调用也好,新增也好,能过通过配置文件来指定,那么对于程序来说是不是更好呢。



原创粉丝点击