当前位置:首页 > C > 正文

C语言观察者模式详解(手把手教你用C实现事件驱动的观察者设计模式)

在软件工程中,观察者模式(Observer Pattern)是一种非常经典的行为型设计模式。它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。当主题对象的状态发生变化时,所有依赖于它的观察者都会得到通知并自动更新。

虽然 C语言 是一门过程式语言,不像 C++ 或 Java 那样原生支持面向对象特性,但我们依然可以通过函数指针、结构体等机制来优雅地实现 观察者设计模式。本文将带你从零开始,用 C 语言实现一个完整的观察者模式,非常适合初学者学习和理解 事件驱动编程C语言 的核心思想。

C语言观察者模式详解(手把手教你用C实现事件驱动的观察者设计模式) C语言观察者模式 观察者设计模式C实现 C语言设计模式教程 事件驱动编程C语言 第1张

为什么使用观察者模式?

想象一下这样的场景:你开发了一个天气监测系统,当温度变化时,需要同时更新手机 App、网页显示、日志记录等多个模块。如果每个模块都直接调用温度检测函数,代码会高度耦合,难以维护。

而使用 C语言观察者模式,你可以让这些模块“订阅”温度变化事件。一旦温度更新,系统自动通知所有订阅者,无需硬编码调用关系,大大提高了代码的灵活性和可扩展性。

C语言实现观察者模式的核心思路

  • 定义一个“主题”(Subject),用于管理观察者列表。
  • 定义“观察者”(Observer),通常是一个包含回调函数指针的结构体。
  • 提供注册(attach)、注销(detach)和通知(notify)接口。

完整代码实现

下面是一个完整的、可编译运行的 C 语言观察者模式示例:

#include <stdio.h>#include <stdlib.h>// 定义观察者结构体typedef struct Observer {    void (*update)(const char* message);} Observer;// 定义主题结构体(最多支持10个观察者)typedef struct Subject {    Observer* observers[10];    int observer_count;} Subject;// 初始化主题void init_subject(Subject* subject) {    subject->observer_count = 0;}// 注册观察者void attach(Subject* subject, Observer* observer) {    if (subject->observer_count < 10) {        subject->observers[subject->observer_count++] = observer;        printf("观察者已注册\n");    }}// 注销观察者void detach(Subject* subject, Observer* observer) {    for (int i = 0; i < subject->observer_count; i++) {        if (subject->observers[i] == observer) {            // 将后面的观察者前移            for (int j = i; j < subject->observer_count - 1; j++) {                subject->observers[j] = subject->observers[j + 1];            }            subject->observer_count--;            printf("观察者已注销\n");            break;        }    }}// 通知所有观察者void notify(Subject* subject, const char* message) {    for (int i = 0; i < subject->observer_count; i++) {        subject->observers[i]->update(message);    }}// 具体的观察者回调函数void phone_update(const char* message) {    printf("📱 手机收到通知: %s\n", message);}void web_update(const char* message) {    printf("🌐 网页收到通知: %s\n", message);}void log_update(const char* message) {    printf("📝 日志记录: %s\n", message);}// 主函数int main() {    // 创建主题    Subject weather_station;    init_subject(&weather_station);    // 创建观察者    Observer phone = {phone_update};    Observer web = {web_update};    Observer logger = {log_update};    // 注册观察者    attach(&weather_station, &phone);    attach(&weather_station, &web);    attach(&weather_station, &logger);    printf("\n--- 温度更新为 25°C ---\n");    notify(&weather_station, "当前温度: 25°C");    printf("\n--- 注销日志观察者 ---\n");    detach(&weather_station, &logger);    printf("\n--- 温度更新为 30°C ---\n");    notify(&weather_station, "当前温度: 30°C");    return 0;}

代码解析

1. Observer 结构体只包含一个函数指针 update,这是观察者的“响应行为”。

2. Subject 结构体维护一个观察者数组,并提供 attachdetachnotify 方法。

3. 在 main 函数中,我们创建了三个观察者(手机、网页、日志),并将它们注册到天气站主题中。

4. 当调用 notify 时,所有注册的观察者都会收到消息;注销某个观察者后,它将不再接收通知。

总结

通过本教程,你已经掌握了如何在 C语言 中实现 观察者设计模式。这种模式非常适合用于 事件驱动编程C语言 场景,如 GUI 事件处理、传感器数据分发、游戏状态同步等。

记住,设计模式的本质是解耦。即使在没有类和继承的 C 语言中,只要理解其思想,依然可以写出高内聚、低耦合的优雅代码。

希望这篇 C语言设计模式教程 对你有所帮助!动手试试吧,修改代码,添加更多观察者,体验事件驱动的魅力!