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

C++ 设计模式-观察者模式


股票监控系统(多用户、多股票)

系统需求
  1. 支持同时监控多个股票代码(如 AAPL、GOOGL、TSLA)
  2. 每个用户可以订阅不同股票的价格变动
  3. 支持不同策略组合(价格警报、自动交易、日志记录)
  4. 实时显示不同用户的订阅状态

完整实现代码

#include <iostream>
#include <string>
#include <vector>
#include <unordered_map>
#include <memory>
#include <thread>
#include <mutex>
#include <atomic>
#include <random>
#include <iomanip>
#include <chrono>
#include <algorithm>
#include <initializer_list>

// 前向声明
class StockEvent;
class PriceUpdateEvent;

// 类型别名
using StockSymbol = std::string;
using UserID = std::string;

// 抽象观察者接口
class TradingStrategy {
   
public:
    virtual ~TradingStrategy() = default;
    virtual void handleEvent(const StockEvent& event) = 0;
    virtual std::vector<StockSymbol> subscribedSymbols() const = 0;
};

// 事件基类
class StockEvent {
   
public:
    virtual ~StockEvent() = default;
    virtual StockSymbol symbol() const = 0;
    virtual double price() const = 0;
    virtual std::string toString() const = 0;
};

// 具体股票事件
class PriceUpdateEvent : public StockEvent {
   
    StockSymbol _symbol;
    double _price;
    std::chrono::system_clock::time_point _timestamp;

public:
    PriceUpdateEvent(StockSymbol sym, double price)
        : _symbol(std::move(sym)), _price(price),
          _timestamp(std::chrono::system_clock::now()) {
   }

    StockSymbol symbol() const override {
    return _symbol; }
    double price() const override {
    return _price; }

    std::string toString() const override {
   
        std::time_t t = std::chrono::system_clock::to_time_t(_timestamp);
        std::stringstream ss;
        ss << _symbol << " $" << std::fixed << std::setprecision(2) << _price
           << " @ " << std::ctime(&t);
        return ss.str();
    }
};

// 股票交易所核心
class StockExchange {
   
    struct StockData {
   
        double basePrice;
        std::atomic<double> currentPrice;
        std::vector<std::shared_ptr<TradingStrategy>> subscribers;
        StockData(const StockData&) = delete;
        // 添加构造函数
        StockData(double base, double current, std::vector<std::shared_ptr<TradingStrategy>>&& subs)
            : basePrice(base),
              currentPrice(current),
              subscribers(std::move(subs)) {
   }
    };

    std::unordered_map<StockSymbol, StockData*> _stocks;
    mutable std::mutex _mutex;
    std::atomic<bool> _running{
   true};
    std::vector<std::thread> _workers;

    // 价格生成器
    double generateNewPrice(double base) {
   
        static std::mt19937 gen(std::random_device{
   }());
        std::normal_distribution<> dist(0, base * 0.02);
        return base + dist(gen);
    }

    /

http://www.kler.cn/a/556741.html

相关文章:

  • 《代码随想录第三十九天》——背包问题二维、背包问题一维、分割等和子集
  • 精准测量PMD:OCI-V光矢量分析系统赋能光纤通信性能优化
  • 基于eBPF的智能诊断平台:实现云原生系统的自愈型运维体系
  • 如何有效利用MYSQL的连接数
  • 如何在WPS打开的word、excel文件中,使用AI?
  • 如何利用 Vue 的生命周期钩子进行初始化和清理操作?
  • DeepSeek接入Siri(已升级支持苹果手表)完整版硅基流动DeepSeek-R1部署
  • AGI觉醒假说的科学反驳:从数学根基到现实约束的深度解析
  • 计算机网络基础杂谈(局域网、ip、子网掩码、网关、DNS)
  • DeepSeek与Grok:AI语言模型的全面对决
  • llama-factory部署微调方法(wsl-Ubuntu Windows)
  • 计算机毕业设计Python考研院校推荐系统 考研分数线预测 考研推荐系统 考研可视化(代码+LW文档+PPT+讲解视频)
  • Linux-CentOS Firewall操作
  • 改进收敛因子和比例权重的灰狼优化算法【期刊论文完美复现】(Matlab代码实现)
  • matlab 海浪模型和舰艇动力学模型
  • 在windows下安装windows+Ubuntu16.04双系统(下)
  • 解决 Ubuntu 中 Docker 安装时“无法找到软件包”错误
  • 人工智能任务23-天文领域的超亮超新星能源机制结合深度神经网络的研究方向
  • 什么是超越编程(逾编程)(元编程?)
  • C++初阶——简单实现vector