用 c语言实现 订阅分发框架
时间: 2023-10-27 13:06:45 浏览: 160
Springboot+HSF分布式服务框架+EDAS注册中心,实现发布订阅模式
订阅分发框架是一种常见的设计模式,它用于实现事件驱动的系统。在该框架中,订阅者可以订阅一个或多个事件,发布者可以发布事件,订阅者接收到事件后可以执行相应的操作。下面是一个用C语言实现订阅分发框架的示例代码:
```
#include <stdio.h>
#include <stdlib.h>
// 定义事件类型
typedef enum {
EVENT_TYPE_1,
EVENT_TYPE_2,
EVENT_TYPE_3
} event_type_t;
// 定义事件数据结构
typedef struct {
event_type_t type;
int data;
} event_t;
// 定义订阅者数据结构
typedef struct subscriber_t {
void (*callback)(event_t event); // 回调函数
struct subscriber_t* next; // 下一个订阅者
} subscriber_t;
// 定义发布者数据结构
typedef struct {
subscriber_t* subscribers[3]; // 订阅者链表
} publisher_t;
// 初始化发布者
void publisher_init(publisher_t* publisher)
{
for (int i = 0; i < 3; i++) {
publisher->subscribers[i] = NULL;
}
}
// 添加订阅者
void publisher_subscribe(publisher_t* publisher, event_type_t type, void (*callback)(event_t event))
{
// 创建新的订阅者
subscriber_t* new_subscriber = (subscriber_t*)malloc(sizeof(subscriber_t));
new_subscriber->callback = callback;
new_subscriber->next = NULL;
// 将订阅者添加到链表中
subscriber_t* last_subscriber = publisher->subscribers[type];
if (last_subscriber == NULL) {
publisher->subscribers[type] = new_subscriber;
} else {
while (last_subscriber->next != NULL) {
last_subscriber = last_subscriber->next;
}
last_subscriber->next = new_subscriber;
}
}
// 发布事件
void publisher_publish(publisher_t* publisher, event_t event)
{
// 找到该事件的订阅者链表
subscriber_t* subscriber = publisher->subscribers[event.type];
// 遍历链表,调用每个订阅者的回调函数
while (subscriber != NULL) {
subscriber->callback(event);
subscriber = subscriber->next;
}
}
// 定义回调函数
void callback1(event_t event)
{
printf("Event type 1 received with data %d\n", event.data);
}
void callback2(event_t event)
{
printf("Event type 2 received with data %d\n", event.data);
}
void callback3(event_t event)
{
printf("Event type 3 received with data %d\n", event.data);
}
int main()
{
// 初始化发布者
publisher_t publisher;
publisher_init(&publisher);
// 添加订阅者
publisher_subscribe(&publisher, EVENT_TYPE_1, callback1);
publisher_subscribe(&publisher, EVENT_TYPE_2, callback2);
publisher_subscribe(&publisher, EVENT_TYPE_3, callback3);
// 发布事件
event_t event1 = { EVENT_TYPE_1, 123 };
event_t event2 = { EVENT_TYPE_2, 456 };
event_t event3 = { EVENT_TYPE_3, 789 };
publisher_publish(&publisher, event1);
publisher_publish(&publisher, event2);
publisher_publish(&publisher, event3);
return 0;
}
```
在上面的代码中,我们定义了事件类型和事件数据结构,订阅者数据结构和发布者数据结构。发布者通过添加订阅者和发布事件来实现订阅分发框架。我们还定义了三个回调函数,用于处理不同类型的事件。在main函数中,我们创建了一个发布者,添加三个订阅者,并发布了三个事件。当订阅者收到事件时,它们会执行相应的回调函数。
阅读全文