什么是回调函数?
回调函数就是一个被作为参数传递的函数。回调函数就是允许用户把需要调用的函数的指针作为参数传递给一个函数,以便该函数在处理相似事件的时候可以
灵活的使用不同的方法。
其工作机制具体如下:
1.定义一个回调函数
2.提供函数实现的一方在初始化的时候,将回调函数的函数指针注册给调用者
3.调用者在程序中调用接口函数
当我们想通过一个统一接口实现不同内容的时候,亦或是所编写的函数必须能够在不同的时刻执行不同的类型的工作或者执行只能由函数调用者定义的工作,回调函数就是很好的实现手段。
使用回调函数有什么好处?
回调函数可以帮助降低代码耦合度。耦合性是程序结构中各个模块之间相互关联的度量。它取决于各个模块之间接口的复杂程度、调用模块的方式以及哪些信息通过接口。业务需求变换时,只需要修改或者增加回调函数,增加了代码的隔离性。
在Lab5.2的示例代码中,SearchLinkTableNode函数中,在遍历链表时,第二个参数运用到了回调函数SearchCondition,在SearchLinkTableNode中调用传入的回调函数:
tLinkTableNode * SearchLinkTableNode(tLinkTable *pLinkTable,
int Condition(tLinkTableNode * pNode, void * args),
void * args)
{
if(pLinkTable == NULL || Condition == NULL)
{
return NULL;
}
tLinkTableNode * pNode = pLinkTable->pHead;
while(pNode != NULL)
{
if(Condition(pNode, args) == SUCCESS)
{
return pNode;
}
pNode = pNode->pNext;
}
return NULL;
}
SearchCondition的定义如下:
int SearchCondition(tLinkTableNode * pLinkTableNode, void * args)
{
char * cmd = (char*) args;
tDataNode * pNode = (tDataNode *)pLinkTableNode;
if(strcmp(pNode->cmd, cmd) == 0)
{
return SUCCESS;
}
return FAILURE;
}
通过这样的方法,对于链表的搜索函数,在实现过程中不需要去具体实现找到节点的方法,只要接收回调函数返回的是否匹配的信息即可,使得搜索函数的适用性更加广泛,实现起来也更加简单。
同样在示例代码中,主要分离了数据部分DataNode和链表的管理部分LinkTable,实现了接口分层。
作者:152