欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 艺术 > C++ 设计模式-观察者模式

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

2025/2/22 22:26:52 来源:https://blog.csdn.net/ox0080/article/details/145777381  浏览:    关键词: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);}/

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词