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

实习技能记录【4】-----消息分发中的观察者模型

观察者

观察者模式(Observer Pattern)是一种行为型设计模式,主要用于定义对象之间的一对多依赖关系,让多个观察者对象能够同时监听某个主题对象的状态变化,并在主题对象状态改变时自动通知所有观察者对象。

参考b站博主代码:

#include <list>
#include <iostream> struct Stock;struct Observer {Stock* stock;Observer(Stock* stock);       //定义Observer的构造函数virtual ~Observer();          //虚析构函数virtual void update(int) = 0; //虚函数
};//Monitor继承自Observer
struct Monitor : Observer {explicit Monitor(Stock* stock) : Observer(stock) {} //避免隐式转换,用传入monitor的stock初始化父类void print(int v) {std::cout << "Monitor: " << v;}void update(int v) override { //monitor子类覆写的update函数print(v);}
};struct Billboard : Observer {explicit Billboard(Stock* stock) : Observer(stock) {}void display(int v) {std::cout << "Billboard: " << v;}void update(int v) override {display(v);}
};struct Stock {int price = 0;std::list<Observer*> observerList;//创建一个observer类指针类型的指针列表void attach(Observer* o) {observerList.push_back(o);}void detach(Observer* o) { observerList.remove(o); }void notify(int v) {for (auto observer : observerList) {observer->update(v);}}void setPrice(int v) { price = v;notify(v);}
};Observer::Observer(Stock* stk) : stock(stk) {stock->attach(this);
}Observer::~Observer() {stock->detach(this);
}int main() {Stock stock;Monitor monitor { &stock };Billboard board { &stock };stock.setPrice(10);
}

ai修改的c语言版本

typedef struct Stock Stock;
typedef struct Observer Observer;// 定义Observer(相当于父类)
struct Observer {Stock* stock;void (*update)(Observer* self, int v); // 函数指针模拟虚函数Observer* next; // 简单链表
};// 定义Stock
struct Stock {int price;Observer* observerList; // 单链表头
};// 注册observer
void attach(Stock* stock, Observer* observer) {observer->next = stock->observerList;stock->observerList = observer;
}// 注销observer
void detach(Stock* stock, Observer* observer) {Observer** current = &stock->observerList;while (*current) {if (*current == observer) {*current = observer->next;break;}current = &((*current)->next);}
}// 通知所有观察者
void notify(Stock* stock, int v) {Observer* current = stock->observerList;while (current) {current->update(current, v);current = current->next;}
}// 设置价格并通知
void setPrice(Stock* stock, int v) {stock->price = v;notify(stock, v);
}// Monitor对象(子类)
typedef struct {Observer base; // 继承Observer
} Monitor;// Monitor的update实现
void Monitor_update(Observer* self, int v) {printf("Monitor: %d\n", v);
}// 创建Monitor
Monitor* Monitor_create(Stock* stock) {Monitor* monitor = (Monitor*)malloc(sizeof(Monitor));monitor->base.stock = stock;monitor->base.update = Monitor_update;monitor->base.next = NULL;attach(stock, (Observer*)monitor);return monitor;
}// 销毁Monitor
void Monitor_destroy(Monitor* monitor) {detach(monitor->base.stock, (Observer*)monitor);free(monitor);
}// Billboard对象(子类)
typedef struct {Observer base;
} Billboard;// Billboard的update实现
void Billboard_update(Observer* self, int v) {printf("Billboard: %d\n", v);
}// 创建Billboard
Billboard* Billboard_create(Stock* stock) {Billboard* board = (Billboard*)malloc(sizeof(Billboard));board->base.stock = stock;board->base.update = Billboard_update;board->base.next = NULL;attach(stock, (Observer*)board);return board;
}// 销毁Billboard
void Billboard_destroy(Billboard* board) {detach(board->base.stock, (Observer*)board);free(board);
}// 测试
int main() {Stock stock = { 0, NULL };Monitor* monitor = Monitor_create(&stock);Billboard* billboard = Billboard_create(&stock);setPrice(&stock, 10);// 销毁Monitor_destroy(monitor);Billboard_destroy(billboard);return 0;
}
http://www.xdnf.cn/news/2966.html

相关文章:

  • 聚焦智能体未来,领驭科技在微软创想未来峰会大放异彩
  • 每日一道leetcode(不会做学习版,多学一题)
  • SpringBoot+Mybatis通过自定义注解实现字段加密存储
  • Astro大屏中关于数据流转的数据接入与数据中心之间的逻辑关系梳理
  • 笔试专题(十二)
  • 字符串(格式化字符串字面值)进行输出
  • Rust 的 Web 世界:actix_web 轻松接收 JSON 请求体
  • 打造美观 API 文档:Spring Boot + Swagger 实战指南
  • C++23 std::byteswap:反转字节 (P1272R4)
  • C#里创建一个TCP客户端连接类
  • 【LeetCode】彩灯装饰记录 III
  • 【运维】使用 DataX 实现 MySQL 到 PostgreSQL 的数据同步
  • 苍穹外卖心得体会
  • [stm32] 4-1 USART(1)
  • 流量控制机制
  • 拆固态硬盘短接开卡+ as ssd benchmark查看硬盘读写速度
  • 基于STM32、HAL库的ADS8866IDGSR模数转换器ADC驱动程序设计
  • 华为云Astro大屏从iotda影子设备抽取数据做设备运行状态的大屏实施步骤
  • Android——Serializable和Parcelable
  • Spring、Spring MVC 与 Spring Boot 的关系与核心用途
  • 什么是全景相机?
  • jenkins slave节点打包报错Failed to create a temp file on
  • Android学习总结之Bitmap篇
  • 《数学物理方程》——第一章 引入与基本概念
  • 【AI工具】DeepWiki试用
  • 第十六届蓝桥杯 C/C++ B组 题解
  • 私有云与虚拟化攻防2(OpenStack渗透场景,大部分云平台都是基于此进行二次开发)
  • C++ 类和对象(3)初始化列表、友元函数、内部类
  • 创龙全志T536全国产(4核A55 ARM+RISC-V+NPU 17路UART)工业开发板硬件说明书
  • 免费IP证书申请