在分层架构中使用回调
从OSI网络模型到操作系统,任何日常生活项目都是基于分层架构的。有没有想过上层和下层之间的抽象是如何创建的?
这都是关于回调的。因此,通常创建上层是为了使事情更简单和更易于使用(如 SDK),而下层是与网络(基于网络的项目)或系统级调用(基于操作系统的项目)交互的实际层。因此,我们可以直接从上层源文件调用在下层定义(和声明)的函数,并通过函数参数传递数据。但是,我们不能只从下层调用上层的函数,因为这会产生循环依赖。所以,这里回调出现了。
回调是通过函数的引用作为另一个函数的参数传递函数并稍后通过引用调用它的方式。
假设upperlayer.c和lowerlayer.c分别是上层和下层的源文件。 lowerlayer.h是lowerlayer.c的头文件。在upperlayer.c中,首先将notify_observer()的函数引用作为 register_callback ( ) 的参数传递给lowerlayer.c 。这称为在底层注册回调。现在,下层知道notify_observer()的函数引用。 register_callback()函数只是将函数引用存储到全局函数指针g_notify_ob中,因此文件中的任何函数都可以调用notify_observer() 。现在,每当下层需要将数据传递给上层(或需要发送通知)时,它只需通过调用g_notify_ob()来调用notify_observer() 。
下面是upperlayer.c
#include
#include "lowerlayer.h"
void notify_observer()
{
printf("Function called by callback\n");
}
int main()
{
// Calling register_callback function and
// passing address of notify_observer as argument
register_callback(notify_observer);
lowerlevelfunction();
}
这是lowerlayer.h。突出显示的行只是表示将实际作为引用传递的回调函数的原型。原型的基本模板是这样的,
typedef (*)
()
// Below is the prototype of the function
// that will be actually passed by reference
typedef void (*notify_ob)(void);
void register_callback(notify_ob);
void lowerlevelfunction();
现在这是 lowerlayer.c
#include "lowerlayer.h"
#define NULL 0
notify_ob g_notify_ob;
// Callback function
void lowerlevelfunction()
{
// Calling back to notify_observer
g_notify_ob();
}
// Callback registration
void register_callback(notify_ob fun)
{
g_notify_ob = fun;
}
如果我们像这样编译和运行这些文件,输出将是这样的。
$gcc -c upperlayer.c
$gcc -c lowerlayer.c
$gcc -o exe upperlayer.o lowerlayer.o
$./exe
Output: Function called by callback