C语言实现责任链二 通过配置文件改变处理逻辑
这篇文章承接上一篇文章。
通过配置文件来指定来指定处理逻辑。。这个貌似很神奇。
为了简化,处理配置文件的部分我不罗嗦,我假定函数名已经读出来了。放在一个数组里面。
比如:
char *FunName = { "FunA",
"FunB",
"FunC",}
但是这些函数名有什么用呢。
但是我们要做更多的处理。
首先,假如有这么几个处理函数:
void FunA(void *pData,struct HandleChain *pChain)
{
//......处理逻辑A
doChain(pData,pChain);
//...处理逻辑A
}
void FunB(void *pData,struct HandleChain *pChain)
{
//......处理逻辑B
doChain(pData,pChain);
//...处理逻辑B
}
void FunC(void *pData,struct HandleChain *pChain)
{
//......处理逻辑C
doChain(pData,pChain);
//...处理逻辑C
}
跟上次文章一样。。。
我们建立一个结构体。
struct FunNameToAddress
{
char FunName[20];
unsigned long FunAddress;
}
然后建立一个结构体数组:
struct FunNameToAddress funs[3] = {
{"FunA",(unsigned long)FunA},
{"FunB",(unsigned long)FunB},
{"FunC",(unsigned long)FunC}};
然后我们根据FunName这个指针数组,通过一个循环,就可以查找函数名对应的函数地址。
用这些个地址来初始化 struct HandleChain MyChain ;
最后调用doChain。
这个处理流程跟上篇文章差不多,只不过,我们程序维护了一个函数名到函数地址的一个映射。
这篇文章承接上一篇文章。
通过配置文件来指定来指定处理逻辑。。这个貌似很神奇。
为了简化,处理配置文件的部分我不罗嗦,我假定函数名已经读出来了。放在一个数组里面。
比如:
char *FunName = { "FunA",
"FunB",
"FunC",}
但是这些函数名有什么用呢。
其实我们的关键是通过函数名来获取函数地址。这听起来有点像Java里面的反射,Java不就是通过类名字符串来动态的加载一个类,创建对象吗。
但是我们要做更多的处理。
首先,假如有这么几个处理函数:
void FunA(void *pData,struct HandleChain *pChain)
{
//......处理逻辑A
doChain(pData,pChain);
//...处理逻辑A
}
void FunB(void *pData,struct HandleChain *pChain)
{
//......处理逻辑B
doChain(pData,pChain);
//...处理逻辑B
}
void FunC(void *pData,struct HandleChain *pChain)
{
//......处理逻辑C
doChain(pData,pChain);
//...处理逻辑C
}
跟上次文章一样。。。
我们建立一个结构体。
struct FunNameToAddress
{
char FunName[20];
unsigned long FunAddress;
}
然后建立一个结构体数组:
struct FunNameToAddress funs[3] = {
{"FunA",(unsigned long)FunA},
{"FunB",(unsigned long)FunB},
{"FunC",(unsigned long)FunC}};
然后我们根据FunName这个指针数组,通过一个循环,就可以查找函数名对应的函数地址。
用这些个地址来初始化 struct HandleChain MyChain ;
最后调用doChain。
这个处理流程跟上篇文章差不多,只不过,我们程序维护了一个函数名到函数地址的一个映射。
这样我们可以把所有处理逻辑的函数都写好了。程序编译完成后,程序执行的时候,就有了一个映射表。程序通过读取文件,把你设定的哪些处理函数读取出来。然后程序根据这些来执行程序。
好处:自己定义处理函数的执行顺序,自己设定用哪些处理函数。