用c++实现一个发布订阅模式
时间: 2023-05-26 19:03:41 浏览: 143
发布订阅模式是一种消息通信模式,其中发送者(发布者)向所有已订阅的接收者(订阅者)发送消息。订阅者注册的兴趣被维护在 PubSub 系统的一个目录中,通常使用 topics 或者 channels 来对消息进行分类。
下面是使用 C 语言实现发布订阅模式的代码示例:
```
#include <stdio.h>
#define MAX_TOPICS 100
#define MAX_SUBSCRIBERS 10
typedef struct {
char name[20];
void (*func)(char*);
} subscriber;
typedef struct {
char name[20];
subscriber subs[MAX_SUBSCRIBERS];
int num_subs;
} topic;
topic topics[MAX_TOPICS];
int num_topics = 0;
void subscribe(char *topic_name, subscriber s) {
int i, topic_index = -1;
// Find the topic index
for (i = 0; i < num_topics; i++) {
if (strcmp(topics[i].name, topic_name) == 0) {
topic_index = i;
break;
}
}
// If the topic doesn't exist, create it
if (topic_index == -1) {
strcpy(topics[num_topics].name, topic_name);
topic_index = num_topics;
num_topics++;
}
// Add the subscriber to the topic
topics[topic_index].subs[topics[topic_index].num_subs] = s;
topics[topic_index].num_subs++;
}
void publish(char *topic_name, char *message) {
int i, j, topic_index = -1;
// Find the topic index
for (i = 0; i < num_topics; i++) {
if (strcmp(topics[i].name, topic_name) == 0) {
topic_index = i;
break;
}
}
// If the topic doesn't exist, return
if (topic_index == -1) {
return;
}
// Call the subscriber functions
for (j = 0; j < topics[topic_index].num_subs; j++) {
topics[topic_index].subs[j].func(message);
}
}
// Example usage
void print_message(char *message) {
printf("%s\n", message);
}
int main() {
subscriber s1 = {"Subscriber 1", print_message};
subscriber s2 = {"Subscriber 2", print_message};
subscribe("topic1", s1);
subscribe("topic1", s2);
subscribe("topic2", s2);
publish("topic1", "Hello world!");
publish("topic2", "Goodbye world!");
return 0;
}
```
在此代码中,我们创建了两个结构体:`subscriber` 和 `topic`。每个 `subscriber` 包含一个名称和一个函数指针,该函数指针将在发布时调用。每个 `topic` 包含一个名称和一个数组,该数组存储了订阅该主题的所有订阅者。
我们实现了两个函数:`subscribe()` 和 `publish()`。`subscribe()` 函数接受一个主题名称和一个订阅者作为参数,并将订阅者添加到该主题的 `subs` 数组中。如果主题不存在,则创建一个新主题。`publish()` 函数接受一个主题名称和一条消息作为参数,并调用订阅该主题的每个订阅者的函数,将该消息作为参数传递给它们。
最后我们通过一个示例演示了一个订阅者订阅两个不同的主题,发布者发布给他们不同的消息。