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

交易引擎中的设计模式

在WtHftEngine.cpp中,主要运用了以下几种设计模式,结合代码结构具体分析如下:


1. 观察者模式(Observer Pattern)​

核心应用场景:实时市场数据的分发机制
代码体现

// 行情到达时分发给订阅者
void WtHftEngine::on_tick(const char* stdCode, WTSTickData* curTick) {auto sit = _tick_sub_map.find(stdCode);if (sit != _tick_sub_map.end()) {for (auto& sub : sit->second) {HftContextPtr ctx = getContext(sub.first);ctx->on_tick(stdCode, curTick); // 通知观察者}}
}

模式要素

  • Subject(主题)​WtHftEngine维护_tick_sub_map等订阅关系表
  • Observer(观察者)​HftContext策略实例,实现on_tick等回调接口
  • 通知机制:通过遍历订阅列表触发策略回调

2. 策略模式(Strategy Pattern)​

核心应用场景:支持多种交易算法的灵活替换
代码体现

class HftStraBaseCtx : public IHftStraCtx {
public:virtual void on_tick(const char* stdCode, WTSTickData* newTick) = 0;// 其他策略接口...
};// 引擎统一调用策略接口
void WtHftEngine::dispatch_to_strategy(uint32_t sid, EventType e) {HftContextPtr ctx = getContext(sid);if (ctx) ctx->on_event(e); // 多态调用
}

模式要素

  • Strategy InterfaceIHftStraCtx抽象接口
  • Concrete Strategy:具体策略类继承HftStraBaseCtx
  • ContextWtHftEngine通过_ctx_map管理策略实例

3. 工厂方法模式(Factory Method Pattern)​

核心应用场景:策略上下文的动态创建
代码体现

void WtHftEngine::addContext(HftContextPtr ctx) {_ctx_map[ctx->id()] = ctx; // 注册策略实例
}// 外部通过工厂创建具体策略对象
HftContextPtr createStrategy(const char* name) {return new MyHftStrategy(name);
}

模式要素

  • ProductHftContextPtr抽象产品接口
  • Concrete ProductMyHftStrategy等具体策略
  • Factory:通过addContext间接实现对象注册

4. 组合模式(Composite Pattern)​

核心应用场景:批量管理策略生命周期
代码体现

std::map<uint32_t, HftContextPtr> _ctx_map;void WtHftEngine::run() {for (auto& ctxPair : _ctx_map) {ctxPair.second->on_init(); // 统一初始化}
}

模式要素

  • ComponentHftContextPtr统一接口
  • Composite_ctx_map作为容器管理所有组件
  • 操作一致性:批量调用on_init/on_session_begin等方法

5. 单例模式(Singleton Pattern)​

核心应用场景:确保全局唯一引擎实例
代码体现

class WtHftEngine {
public:static WtHftEngine& getInstance() {static WtHftEngine instance;return instance;}
private:WtHftEngine(); // 私有构造函数
};

模式要素

  • 静态实例:通过getInstance()访问唯一实例
  • 私有构造:防止外部创建多个实例

6. 状态模式(State Pattern)​

核心应用场景:交易日状态管理
代码体现

void WtHftEngine::on_session_begin() {_ready = true; // 切换状态for(auto& ctx : _ctx_map) {ctx.second->on_session_begin(_cur_tdate);}
}void WtHftEngine::on_session_end() {_ready = false;// 其他状态清理...
}

模式要素

  • State Interface:隐含的_ready状态标识
  • Concrete State:交易日开始(_ready=true)/结束(_ready=false)
  • 状态依赖行为:例如_ready控制是否处理交易指令

模式协作关系

graph TDObserver((Observer)) --> |订阅/通知| Subject[[WtHftEngine]]Strategy1(MyStrategyA) --> |实现| StrategyInterface[IHftStraCtx]Strategy2(MyStrategyB) --> |实现| StrategyInterfaceSubject --> |管理| Composite{{策略容器}}Composite --> Strategy1Composite --> Strategy2Subject --> |状态切换| State[交易日状态]Factory --> |创建| Strategy1Factory --> |创建| Strategy2

关键设计价值

  1. 解耦性:观察者模式分离数据生产(引擎)与消费(策略)
  2. 扩展性:策略模式支持快速接入新交易算法
  3. 统一管理:组合模式简化多策略批量操作
  4. 状态安全:单例模式确保全局访问点唯一
  5. 生命周期:工厂方法规范对象创建过程

这些模式共同构建了一个高内聚、低耦合的高频交易引擎架构,兼顾性能与可维护性。

相关文章:

交易引擎中的设计模式

在WtHftEngine.cpp中&#xff0c;主要运用了以下几种设计模式&#xff0c;结合代码结构具体分析如下&#xff1a; ​1. 观察者模式&#xff08;Observer Pattern&#xff09;​ 核心应用场景&#xff1a;实时市场数据的分发机制 代码体现&#xff1a; // 行情到达时分发给订阅…...

(自用)WebSocket创建流程

在Spring Boot项目中新建WebSocket服务&#xff0c;可以按照以下详细步骤进行操作&#xff1a; 1.创建Spring Boot项目 可以通过Spring Initializr&#xff08;<>&#xff09;快速创建一个新的Spring Boot项目&#xff0c;添加Spring Web和Spring Boot DevTools依赖&…...

Linux——文件(2)文件系统

我们知道&#xff0c;文件在没有被打开时是放在磁盘中的&#xff0c;通常我们未打开的文件数量要远远大于打开的文件数量&#xff0c;而且我们要想打开一个文件&#xff0c;首先需要知道文件在磁盘的位置才能打开&#xff0c;但问题是&#xff0c;面对磁盘中成百上千个文件&…...

蓝桥杯 web 水果拼盘 (css3)

做题步骤&#xff1a; 看结构&#xff1a;html 、css 、f12 分析: f12 查看元素&#xff0c;你会发现水果的高度刚好和拼盘的高度一样&#xff0c;每一种水果的盘子刚好把页面填满了&#xff0c;所以咱们就只要让元素竖着排列&#xff0c;加上是竖着&#xff0c;排不下的换行…...

【eNSP实验】RIP协议

RIP协议介绍 RIP&#xff08;路由信息协议&#xff09;是一种基于距离向量的内部网关协议&#xff0c;适用于小型网络。它通过跳数&#xff08;最多15跳&#xff09;衡量路径成本&#xff0c;定期与相邻路由器交换路由表。RIPv1使用广播更新且不支持子网&#xff0c;RIPv2新增…...

SQL Server常见问题的分类解析(二)

SQL Server常见问题解析100例(31-60) 七、数据库设计与维护问题 表设计不合理导致性能瓶颈问题:大表缺少分区,字段类型过大(如VARCHAR(MAX))。解决方案:使用分区表(PARTITION BY RANGE),优化字段类型。 索引过多导致写入性能下降问题:过度索引导致INSERT/UPDATE变慢…...

JAVA反序列化深入学习(十三):Spring2

让我们回到Spring Spring2 在 Spring1 的触发链上有所变换&#xff1a; 替换了 spring-beans 的 ObjectFactoryDelegatingInvocationHandler使用了 spring-aop 的 JdkDynamicAopProxy &#xff0c;并完成了后续触发 TemplatesImpl 的流程 简而言之&#xff0c;换了一个chain&am…...

Matlab:三维绘图

目录 1.三维曲线绘图命令&#xff1a;plot3 实例——绘制空间直线 实例——绘制三角曲线 2.三维曲线绘图命令&#xff1a;explot3 3.三维网格命令&#xff1a;mesh 实例——绘制网格面 实例——绘制山峰曲面 实例——绘制函数曲线 1.三维曲线绘图命令&#xff1a;plot3 …...

学透Spring Boot — 016. 魔术师 - Spring MVC Conversion Service 类型转换

本文是我的《学透Spring Boot》专栏的第16篇文章&#xff0c;了解更多请移步我的专栏&#xff1a; Postnull的专栏《学透Spring Boot》 目录 遇到问题 日期格式的转换 实现需求 创建转换器 注册转换器 编写Controller 访问测试 存在的问题 解决问题 源码分析 总结 …...

Spring Boot开发三板斧:高效构建企业级应用的核心技法

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家、CSDN平台优质创作者&#xff0c;获得2024年博客之星荣誉证书&#xff0c;高级开发工程师&#xff0c;数学专业&#xff0c;拥有高级工程师证书&#xff1b;擅长C/C、C#等开发语言&#xff0c;熟悉Java常用开发技术&#xff0c…...

人脸考勤管理一体化系统(人脸识别系统,签到打卡)

人脸考勤管理一体化系统 项目介绍 本项目是基于Flask、SQLAlchemy、face_recognition库的人脸考勤管理一体化系统。 系统通过人脸识别技术实现员工考勤打卡、人脸信息采集、人脸模型训练等功能。 项目采用前后端分离的技术框架&#xff0c;基于Flask轻量级Web框架搭建后端服务…...

大数据(4.3)Hive基础查询完全指南:从SELECT到复杂查询的10大核心技巧

目录 背景一、Hive基础查询核心语法1. 基础查询&#xff08;SELECT & FROM&#xff09;2. 条件过滤&#xff08;WHERE&#xff09;3. 聚合与分组&#xff08;GROUP BY & HAVING&#xff09;4. 排序与限制&#xff08;ORDER BY & LIMIT&#xff09; 二、复杂查询实战…...

手搓多模态-03 顶层和嵌入层的搭建

声明&#xff1a;本代码非原创&#xff0c;是博主跟着国外大佬的视频教程编写的&#xff0c;本博客主要为记录学习成果所用。 我们首先开始编写视觉模型这一部分&#xff0c;这一部分的主要功能是接收一个batch的图像&#xff0c;并将其转化为上下文相关的嵌入向量&#xff0c;…...

【经验分享】将qt的ui文件转换为py文件

&#x1f31f; 嗨&#xff0c;我是命运之光&#xff01; &#x1f30d; 2024&#xff0c;每日百字&#xff0c;记录时光&#xff0c;感谢有你一路同行。 &#x1f680; 携手启航&#xff0c;探索未知&#xff0c;激发潜能&#xff0c;每一步都意义非凡。 首先简单的设计一个U…...

常用的国内镜像源

常见的 pip 镜像源 阿里云镜像&#xff1a;https://mirrors.aliyun.com/pypi/simple/ 清华大学镜像&#xff1a;https://pypi.tuna.tsinghua.edu.cn/simple 中国科学技术大学镜像&#xff1a;https://pypi.mirrors.ustc.edu.cn/simple/ 豆瓣镜像&#xff1a;https://pypi.doub…...

探秘JVM内部

在我们编写Java代码&#xff0c;点击运行后&#xff0c;会发生什么事呢&#xff1f; 首先&#xff0c;Java源代码会经过Java编译器将其编译成字节码&#xff0c;放在.class文件中 然后这些字节码文件就会被加载到jvm中&#xff0c;然后jvm会读取这些文件&#xff0c;调用相关…...

在HarmonyOS NEXT 开发中,如何指定一个号码,拉起系统拨号页面

大家好&#xff0c;我是 V 哥。 《鸿蒙 HarmonyOS 开发之路 卷1 ArkTS篇》已经出版上市了哈&#xff0c;有需要的朋友可以关注一下&#xff0c;卷2应用开发篇也马上要出版了&#xff0c;V 哥正在紧锣密鼓的写鸿蒙开发实战卷3的教材&#xff0c;卷3主要以项目实战为主&#xff0…...

利用空间-运动-回波稀疏性进行5D图像重建,以实现自由呼吸状态下肝脏定量磁共振成像(MRI)的加速采集|文献速递--深度学习医疗AI最新文献

Title 题目 5D image reconstruction exploiting space-motion-echo sparsity foraccelerated free-breathing quantitative liver MRI 利用空间-运动-回波稀疏性进行5D图像重建&#xff0c;以实现自由呼吸状态下肝脏定量磁共振成像&#xff08;MRI&#xff09;的加速采集 …...

Qt5 Mac系统检查休眠

在开发跨平台应用程序时,有时候我们需要检测系统的状态,比如是否处于休眠或唤醒状态。Qt是一个强大的跨平台应用开发框架,支持多种操作系统,包括Windows、Linux、macOS等。在这个场景下,我们关注的是如何在Qt5.10中检测到系统是否休眠以及在Mac上实现这一功能。本文将深入…...

ZKmall开源商城B2B2C电商用户隐私信息保护策略:数据脱敏全链路实践

随着业务的不断拓展和用户规模的持续扩大&#xff0c;用户隐私信息的保护也面临着前所未有的挑战。下面将深入探讨ZKmall开源商城在数据脱敏方面的实践&#xff0c;以及针对B2B2C电商用户隐私信息的具体保护策略。 数据脱敏&#xff0c;又称数据去标识化或数据匿名化&#xff0…...

Media streaming mental map

Media streaming is a huge topic with a bunch of scattered technologies, protocols, and formats. You may feel like hearing fragments without seeing the big picture. Let’s build that mental map together — here’s a high-level overview that connects everyt…...

linux Gitkraken 破解

ubuntu 安装 Gitkraken 9.x Pro 版本_gitcracken.git-CSDN博客...

SSL证书颁发机构有哪些呢

证书颁发机构&#xff08;Certificate Authority, CA&#xff09;是负责签发和管理数字证书的权威机构&#xff0c;分为公共信任的 CA 和私有/内部 CA。以下是常见的公共信任的 CA 分类及代表机构&#xff1a; 1. 国际知名公共 CA&#xff08;浏览器/操作系统默认信任&#xff…...

13_pandas可视化_seaborn

导入库 import numpy as np import pandas as pd # import matplotlib.pyplot as plt #交互环境中不需要导入 import seaborn as sns sns.set_context({figure.figsize:[8, 6]}) # 设置图大小 # 屏蔽警告 import warnings warnings.filterwarnings("ignore")关系图 …...

Pgvector的安装

Pgvector的安装 向量化数据的存储&#xff0c;可以为 PostgreSQL 安装 vector 扩展来存储向量化数据 注意&#xff1a;在安装vector扩展之前&#xff0c;请先安装Postgres数据库 vector 扩展的步骤 1、下载vs_BuildTools 下载地址&#xff1a; https://visualstudio.microso…...

如何在大型项目中组织和管理 Vue 3 Hooks?

众所周知,Vue Hooks(通常指 Composition API 中的功能)是 Vue 3 引入的一种代码组织方式,用于更灵活地组合和复用逻辑。但是在项目中大量使用这种写法该如何更好的搭建结构呢?以下是可供参考实践的案例。 一、Hooks 组织原则 单一职责每个 Hook 应专注于完成单一功能,避…...

Django接入 免费的 AI 大模型——讯飞星火(2025年4月最新!!!)

上文有介绍deepseek接入&#xff0c;但是需要 付费&#xff0c;虽然 sliconflow 可以白嫖 token&#xff0c;但是毕竟是有限的&#xff0c;本文将介绍一款完全免费的 API——讯飞星火 目录 接入讯飞星火&#xff08;免费&#xff09; 测试对话 接入Django 扩展建议 接入讯飞星火…...

路由器学习

路由器原理 可以理解成把不同的网络打通&#xff0c;实现通信的设备。比如家里的路由器&#xff0c;他就是把家里的内网和互联网&#xff08;外网&#xff09;打通。 分类 1.&#xff08;按应用场景分类&#xff09; 路由器分为家用的&#xff0c;企业级的&#xff0c;运营…...

Redis 连接:深入解析与优化实践

Redis 连接:深入解析与优化实践 引言 Redis 作为一款高性能的键值型数据库,广泛应用于缓存、会话存储、消息队列等领域。Redis 的连接管理是确保其性能和稳定性的关键。本文将深入探讨 Redis 连接的原理、配置、优化方法以及常见问题,帮助您更好地掌握 Redis 连接技术。 …...

UE5学习记录part14

第17节 enemy behavior 173 making enemies move: AI Pawn Navigation 按P查看体积 So its very important that our nav mesh bounds volume encompasses all of the area that wed like our 因此&#xff0c;我们的导航网格边界体积必须包含我们希望 AI to navigate in and …...