使用C语言来实现一个观察者模式的设计实例
时间: 2024-03-05 17:47:46 浏览: 21
观察者模式可以使用C语言实现,同样可以在对象之间建立一种一对多的依赖关系,当被观察的对象发生变化时,所有依赖于它的对象都能够得到通知并自动更新。下面是一个使用C语言实现观察者模式的例子:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义观察者结构体
typedef struct _Observer {
void (*update)(int value);
struct _Observer* next;
} Observer;
// 定义被观察者结构体
typedef struct _Subject {
int value;
Observer* observers;
} Subject;
// 初始化被观察者
void initSubject(Subject* subject) {
subject->value = 0;
subject->observers = NULL;
}
// 通知所有观察者
void notify(Subject* subject) {
Observer* observer = subject->observers;
while (observer != NULL) {
observer->update(subject->value);
observer = observer->next;
}
}
// 添加观察者
void attach(Subject* subject, Observer* observer) {
observer->next = subject->observers;
subject->observers = observer;
}
// 移除观察者
void detach(Subject* subject, Observer* observer) {
Observer* prev = NULL;
Observer* current = subject->observers;
while (current != NULL) {
if (current == observer) {
if (prev == NULL) {
subject->observers = current->next;
} else {
prev->next = current->next;
}
free(current);
break;
}
prev = current;
current = current->next;
}
}
// 修改被观察者的值并通知观察者
void setValue(Subject* subject, int value) {
subject->value = value;
notify(subject);
}
// 创建观察者
Observer* createObserver(void (*update)(int value)) {
Observer* observer = (Observer*)malloc(sizeof(Observer));
observer->update = update;
observer->next = NULL;
return observer;
}
// 具体的观察者实现
void observerUpdate(int value) {
printf("Value changed to %d\n", value);
}
int main() {
Subject subject;
Observer* observer1 = createObserver(observerUpdate);
Observer* observer2 = createObserver(observerUpdate);
// 将观察者添加到被观察者的观察列表中
attach(&subject, observer1);
attach(&subject, observer2);
// 修改被观察者的值,观察者将会收到通知
setValue(&subject, 3);
// 将观察者从被观察者的观察列表中移除
detach(&subject, observer2);
// 再次修改被观察者的值,只有observer1会收到通知
setValue(&subject, 5);
// 释放内存
free(observer1);
free(observer2);
return 0;
}
```
在这个例子中,`Subject`是被观察者的结构体,`Observer`是观察者的结构体。我们使用单链表来维护观察者列表。当被观察者的值发生改变时,它会调用`notify`函数来通知所有的观察者。在`main`函数中,我们创建了两个观察者对象,并将它们添加到观察列表中,并修改被观察者的值来测试观察者模式的实现。