在软件工程中,观察者模式(Observer Pattern)是一种非常经典的行为型设计模式。它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。当主题对象的状态发生变化时,所有依赖于它的观察者都会得到通知并自动更新。
虽然 C语言 是一门过程式语言,不像 C++ 或 Java 那样原生支持面向对象特性,但我们依然可以通过函数指针、结构体等机制来优雅地实现 观察者设计模式。本文将带你从零开始,用 C 语言实现一个完整的观察者模式,非常适合初学者学习和理解 事件驱动编程C语言 的核心思想。

想象一下这样的场景:你开发了一个天气监测系统,当温度变化时,需要同时更新手机 App、网页显示、日志记录等多个模块。如果每个模块都直接调用温度检测函数,代码会高度耦合,难以维护。
而使用 C语言观察者模式,你可以让这些模块“订阅”温度变化事件。一旦温度更新,系统自动通知所有订阅者,无需硬编码调用关系,大大提高了代码的灵活性和可扩展性。
下面是一个完整的、可编译运行的 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 结构体维护一个观察者数组,并提供 attach、detach 和 notify 方法。
3. 在 main 函数中,我们创建了三个观察者(手机、网页、日志),并将它们注册到天气站主题中。
4. 当调用 notify 时,所有注册的观察者都会收到消息;注销某个观察者后,它将不再接收通知。
通过本教程,你已经掌握了如何在 C语言 中实现 观察者设计模式。这种模式非常适合用于 事件驱动编程C语言 场景,如 GUI 事件处理、传感器数据分发、游戏状态同步等。
记住,设计模式的本质是解耦。即使在没有类和继承的 C 语言中,只要理解其思想,依然可以写出高内聚、低耦合的优雅代码。
希望这篇 C语言设计模式教程 对你有所帮助!动手试试吧,修改代码,添加更多观察者,体验事件驱动的魅力!
本文由主机测评网于2025-12-20发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/20251210519.html