写一个c++观察者模式代码
时间: 2024-05-14 15:13:35 浏览: 12
好的,以下是一个简单的 C 观察者模式的实现:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct _Observer {
void (*update)(struct _Observer *);
} Observer;
typedef struct _Subject {
Observer *observers[10];
int observer_count;
void (*attach)(struct _Subject *, Observer *);
void (*detach)(struct _Subject *, Observer *);
void (*notify)(struct _Subject *);
} Subject;
void Observer_update(Observer *this) {
printf("Observer %p has been informed.\n", this);
}
void Subject_attach(Subject *this, Observer *observer) {
if (this->observer_count < 10) {
this->observers[this->observer_count++] = observer;
}
}
void Subject_detach(Subject *this, Observer *observer) {
int i, j;
for (i = 0; i < this->observer_count; i++) {
if (this->observers[i] == observer) {
for (j = i; j < this->observer_count - 1; j++) {
this->observers[j] = this->observers[j + 1];
}
this->observer_count--;
break;
}
}
}
void Subject_notify(Subject *this) {
int i;
for (i = 0; i < this->observer_count; i++) {
this->observers[i]->update(this->observers[i]);
}
}
Subject *Subject_create() {
Subject *subject = (Subject *)malloc(sizeof(Subject));
subject->observer_count = 0;
subject->attach = Subject_attach;
subject->detach = Subject_detach;
subject->notify = Subject_notify;
return subject;
}
Observer *Observer_create() {
Observer *observer = (Observer *)malloc(sizeof(Observer));
observer->update = Observer_update;
return observer;
}
int main() {
Subject *subject = Subject_create();
Observer *observer1 = Observer_create();
Observer *observer2 = Observer_create();
subject->attach(subject, observer1);
subject->attach(subject, observer2);
printf("Notifying observers...\n");
subject->notify(subject);
subject->detach(subject, observer2);
printf("Notifying observers again...\n");
subject->notify(subject);
free(observer1);
free(observer2);
free(subject);
return 0;
}
```
这个程序实现了一个简单的 C 观察者模式。我们定义一个 `Subject` 结构体和一个 `Observer` 结构体,其中 `Subject` 存储了多个观察者,并提供了 `attach`、`detach` 和 `notify` 等方法,而 `Observer` 定义了一个 `update` 方法,在被通知时会被调用。
在 `main` 函数中,我们创建了一个主题(`Subject`)对象和两个观察者(`Observer`)对象,并逐一将它们添加到主题对象的观察者列表中。然后我们调用了 `notify` 方法通知所有观察者,接着从主题对象中移除了一个观察者,并再次通知所有观察者。最后我们释放了所有对象的内存。
希望这个示例代码能帮助您理解 C 观察者模式的基本实现。如有不便之处,请多多包涵!
相关推荐
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)