参考转载
观察者模式
#include <stdio.h>
// 定义观察者接口
typedef struct {
void (*update)(int); // 更新通知的函数指针
} Observer;
// 定义被观察者类
typedef struct {
int data; // 数据
Observer* observers[5]; // 最多支持5个观察者
int numObservers; // 观察者数量
} Subject;
// 初始化被观察者对象
void initSubject(Subject* subject) {
subject->data = 0;
subject->numObservers = 0;
}
// 注册观察者
void attachObserver(Subject* subject, Observer* observer) {
if (subject->numObservers < 5) {
subject->observers[subject->numObservers++] = observer;
} else {
printf("Cannot attach more observers\n");
}
}
// 通知所有观察者
void notifyObservers(Subject* subject) {
for (int i = 0; i < subject->numObservers; ++i) {
subject->observers[i]->update(subject->data);
}
}
// 设置数据并通知观察者
void setData(Subject* subject, int data) {
subject->data = data;
notifyObservers(subject);
}
// 创建观察者对象
Observer observer1 = {
.update = [](int data) {
printf("Observer 1: Data updated to %d\n", data);
}
};
Observer observer2 = {
.update = [](int data) {
printf("Observer 2: Data updated to %d\n", data);
}
};
int main() {
// 创建被观察者对象
Subject subject;
initSubject(&subject);
// 注册观察者
attachObserver(&subject, &observer1);
attachObserver(&subject, &observer2);
// 设置数据并通知观察者
setData(&subject, 10);
return 0;
}
在这个示例中,我们定义了一个Observer结构体,用来表示观察者的接口,其中包含了一个update函数指针,用来更新通知。然后,我们定义了一个Subject结构体,用来表示被观察者对象,其中包含了数据和观察者数组。我们实现了一些函数来初始化被观察者对象、注册观察者、通知观察者以及设置数据并通知观察者。最后,我们创建了两个观察者对象observer1和observer2,并将它们注册到被观察者对象中。在main函数中,我们创建了被观察者对象并注册了观察者,然后设置了数据并通知观察者。当数据更新时,观察者对象将收到通知并执行相应的操作。