当前位置: 首页 > 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;
}
http://www.dtcms.com/a/164331.html

相关文章:

  • 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+播放量
  • 数据处理方式 之 对数变换 和Box-Cox变换以及对应逆变换【深度学习】
  • Vue2+Vue3学习笔记
  • 什么是Amazon S3
  • 农村供水智能化远程监控解决方案
  • php学习笔记(全面且适合新手)
  • 接入层架构演变
  • Android ProcessState init
  • 初中九年级学生体测准考证照片采集软件使用说明
  • Keras模型保存、加载介绍
  • JavaScript函数声明大比拼