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

实习技能记录【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;
}

相关文章:

  • Canvas基础篇:绘制矩形
  • Git 实操:如何使用交互式 Rebase 移除指定提交(真实案例分享)
  • gradle 下载的tencent的镜像
  • Spark,集群搭建-Standalone
  • 企业战略管理(设计与工程师类)-2-战略规划及管理过程-2-外部环境分析-PESTEL模型实践
  • 从“丈量勘界”到“云端智管”:解码自然资源统一调查监测的智慧密码
  • Linux 下编译BusyBox
  • 《算法笔记》10.5小节——图算法专题->最小生成树 问题 B: Freckles
  • TTL、RS-232 和 RS-485 串行通信电平标准区别解析
  • 如何对多维样本进行KS检验
  • Nerfstudio 环境配置与自有数据集(图片和视频)测试全方位全流程实战【2025最新版!!】
  • Linux 权限管理
  • 【浙江大学DeepSeek公开课】DeepSeek的本地化部署与AI通识教育之未来
  • x86架构-k8s设置openebs的hostpath作为默认存储类的部署记录
  • LeetCode每日一题4.29
  • 省科学技术奖申报答辩PPT设计制作美化
  • 信息检索系统的组成部分和基本架构
  • 4月29日日记
  • jenkins slave节点打包报错Failed to create a temp file on
  • AI国学智慧语录视频,条条视频10W+播放量
  • 辽宁辽阳火灾3名伤者无生命危险
  • 荆州市委书记汪元程:全市各级干部要做到慎微、慎初、慎独、慎友
  • 港交所与香港证监会就“中概股回流意向”已与部分相关企业进行接触
  • 我国将开展市场准入壁垒清理整治行动
  • 中消协发布“五一”消费提示:践行“光盘行动”,抵制餐饮浪费
  • 广州海关原党委委员、副关长刘小威被开除党籍