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

C++中的观察者模式

目录

观察者模式(Observer Pattern)

实际应用

股票价格监控系统

发布-订阅系统

总结


观察者模式(Observer Pattern)

观察者模式是一种行为型设计模式,它定义了对象间的一对多依赖关系。当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。观察者模式主要包含以下角色:
1. Subject(主题):保存对观察者的引用,并提供注册和注销观察者的方法。
2. Observer(观察者):定义一个更新接口,用于接收主题的通知。
3. ConcreteSubject(具体主题):具体实现主题,维护其状态并在状态改变时通知观察者。
4. ConcreteObserver(具体观察者):具体实现观察者,响应主题的通知并进行相应的更新。

实际应用

股票价格监控系统

-- 实现一个股票价格监控系统,当股票价格发生变化时,所有注册的观察者(例如投资者)都会收到通知。

#include <iostream>
#include <vector>
#include <string>
#include <memory>// 观察者接口
class Observer {
public:virtual void update(const std::string& stockName, float price) = 0;
};// 主题接口
class Subject {
public:virtual void registerObserver(std::shared_ptr<Observer> observer) = 0;virtual void removeObserver(std::shared_ptr<Observer> observer) = 0;virtual void notifyObservers() = 0;
};// 具体主题
class Stock : public Subject {
private:std::string name;float price;std::vector<std::shared_ptr<Observer>> observers;public:Stock(const std::string& name, float price) : name(name), price(price) {}void setPrice(float newPrice) {price = newPrice;notifyObservers();}float getPrice() const {return price;}void registerObserver(std::shared_ptr<Observer> observer) override {observers.push_back(observer);}void removeObserver(std::shared_ptr<Observer> observer) override {observers.erase(std::remove(observers.begin(), observers.end(), observer), observers.end());}void notifyObservers() override {for (auto& observer : observers) {observer->update(name, price);}}
};// 具体观察者
class Investor : public Observer {
private:std::string name;public:Investor(const std::string& name) : name(name) {}void update(const std::string& stockName, float price) override {std::cout << "Investor " << name << " is notified that " << stockName << " price changed to " << price << std::endl;}
};// 客户端代码
int main() {auto stock = std::make_shared<Stock>("AAPL", 150.0);auto investor1 = std::make_shared<Investor>("Alice");auto investor2 = std::make_shared<Investor>("Bob");stock->registerObserver(investor1);stock->registerObserver(investor2);stock->setPrice(155.0);stock->setPrice(160.0);stock->removeObserver(investor1);stock->setPrice(165.0);return 0;
}

发布-订阅系统

-- 实现一个简单的发布-订阅系统,当发布者发布新消息时,所有订阅者都会收到通知。

#include <iostream>
#include <vector>
#include <string>
#include <memory>// 观察者接口
class Subscriber {
public:virtual void update(const std::string& message) = 0;
};// 主题接口
class Publisher {
public:virtual void registerSubscriber(std::shared_ptr<Subscriber> subscriber) = 0;virtual void removeSubscriber(std::shared_ptr<Subscriber> subscriber) = 0;virtual void notifySubscribers() = 0;
};// 具体主题
class NewsPublisher : public Publisher {
private:std::string latestNews;std::vector<std::shared_ptr<Subscriber>> subscribers;public:void publishNews(const std::string& news) {latestNews = news;notifySubscribers();}void registerSubscriber(std::shared_ptr<Subscriber> subscriber) override {subscribers.push_back(subscriber);}void removeSubscriber(std::shared_ptr<Subscriber> subscriber) override {subscribers.erase(std::remove(subscribers.begin(), subscribers.end(), subscriber), subscribers.end());}void notifySubscribers() override {for (auto& subscriber : subscribers) {subscriber->update(latestNews);}}
};// 具体观察者
class ConcreteSubscriber : public Subscriber {
private:std::string name;public:ConcreteSubscriber(const std::string& name) : name(name) {}void update(const std::string& message) override {std::cout << "Subscriber " << name << " received: " << message << std::endl;}
};// 客户端代码
int main() {auto publisher = std::make_shared<NewsPublisher>();auto subscriber1 = std::make_shared<ConcreteSubscriber>("Alice");auto subscriber2 = std::make_shared<ConcreteSubscriber>("Bob");publisher->registerSubscriber(subscriber1);publisher->registerSubscriber(subscriber2);publisher->publishNews("Breaking News: Observer Pattern in Action!");publisher->publishNews("Latest Update: New Design Patterns Discovered!");publisher->removeSubscriber(subscriber1);publisher->publishNews("Exclusive: Observer Pattern Simplified!");return 0;
}

总结

观察者模式帮助我们定义了对象间的一对多依赖关系,使得对象之间的通信变得更加灵活和可扩展。

相关文章:

  • rizhuti1.9-最新版-推荐文章缩略图
  • 【软件安装12】CloudCompare点云工具安装 Ubuntu18.04
  • Windows下对于Qt中带 / 的路径的处理
  • SpringBoot解决跨域的三种解决方案
  • 【Ardiuno】实验ESP32单片机搭建简易Web服务器功能(图文)
  • C#——值类型和引用类型的区别详情
  • 硬件存储管理
  • XSKY 在金融行业:新一代分布式核心信创存储解决方案
  • 【备忘录】配置 Docker 守护程序以使用代理服务器
  • aspose-words去水印自用资源
  • MySQL 搭建主从报错 1236
  • 土壤墒情监测站
  • 5_1 Linux 计划任务
  • 第十六章 模板方法模式
  • 上海媒体宣传:上海展览展会媒体邀约宣传怎么做?
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • Dubbo 整合 Pinpoint 做分布式服务请求跟踪
  • ES6--对象的扩展
  • gitlab-ci配置详解(一)
  • golang中接口赋值与方法集
  • iOS帅气加载动画、通知视图、红包助手、引导页、导航栏、朋友圈、小游戏等效果源码...
  • Java基本数据类型之Number
  • LeetCode刷题——29. Divide Two Integers(Part 1靠自己)
  • Linux快速复制或删除大量小文件
  • React+TypeScript入门
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • spring学习第二天
  • SwizzleMethod 黑魔法
  • 编写高质量JavaScript代码之并发
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 仿天猫超市收藏抛物线动画工具库
  • 离散点最小(凸)包围边界查找
  • 如何使用 JavaScript 解析 URL
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • 一个完整Java Web项目背后的密码
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • (14)Hive调优——合并小文件
  • (附源码)计算机毕业设计SSM基于健身房管理系统
  • (求助)用傲游上csdn博客时标签栏和网址栏一直显示袁萌 的头像
  • (微服务实战)预付卡平台支付交易系统卡充值业务流程设计
  • (文章复现)基于主从博弈的售电商多元零售套餐设计与多级市场购电策略
  • (已更新)关于Visual Studio 2019安装时VS installer无法下载文件,进度条为0,显示网络有问题的解决办法
  • (转)JAVA中的堆栈
  • *p++,*(p++),*++p,(*p)++区别?
  • .form文件_一篇文章学会文件上传
  • .Net Attribute详解(上)-Attribute本质以及一个简单示例
  • .Net 路由处理厉害了
  • .NET 依赖注入和配置系统
  • .Net 应用中使用dot trace进行性能诊断
  • .NET 中什么样的类是可使用 await 异步等待的?
  • .NET的微型Web框架 Nancy
  • /etc/sudoer文件配置简析
  • @EnableWebSecurity 注解的用途及适用场景
  • @FeignClient 调用另一个服务的test环境,实际上却调用了另一个环境testone的接口,这其中牵扯到k8s容器外容器内的问题,注册到eureka上的是容器外的旧版本...
  • @德人合科技——天锐绿盾 | 图纸加密软件有哪些功能呢?