OpenBMC中C++策略模式架构、原理与应用


1. 策略模式概述

策略模式(Strategy Pattern)是一种行为型设计模式,它允许在运行时动态选择算法或行为,而无需修改客户端代码。
核心思想封装可互换的算法族,使它们可以独立于使用它们的客户端变化。

1.1 适用场景

OpenBMC 中的典型应用

  • 传感器数据采集策略(如I2C、SPI、模拟信号等不同读取方式)
  • 日志记录策略(本地存储、远程Syslog、DBus上报等)
  • 固件升级策略(TFTP、HTTP、Redfish等不同协议)

2. 策略模式的架构

策略模式通常包含三个核心组件:

  1. Context(上下文):持有策略接口的引用,负责调用具体策略。
  2. Strategy(策略接口):定义所有支持的算法的公共接口。
  3. ConcreteStrategy(具体策略):实现策略接口的具体算法。

2.1 UML 类图

Context
-strategy: Strategy*
+setStrategy(Strategy*)
+executeStrategy()
«interface»
Strategy
+execute()
ConcreteStrategyA
+execute()
ConcreteStrategyB
+execute()

3. C++ 实现示例(结合OpenBMC)

3.1 定义策略接口

// 策略接口:传感器数据读取策略
class SensorReadStrategy {
public:virtual ~SensorReadStrategy() = default;virtual double readData() = 0;  // 纯虚函数
};

3.2 实现具体策略

// 策略1:I2C 读取
class I2CReadStrategy : public SensorReadStrategy {
public:double readData() override {// 模拟I2C读取逻辑return readFromI2C();}
private:double readFromI2C() { /* ... */ }
};// 策略2:模拟信号读取
class AnalogReadStrategy : public SensorReadStrategy {
public:double readData() override {// 模拟ADC读取return readFromADC();}
private:double readFromADC() { /* ... */ }
};

3.3 定义上下文(Context)

// 上下文类:传感器管理器
class SensorManager {
public:explicit SensorManager(SensorReadStrategy* strategy) : strategy_(strategy) {}void setStrategy(SensorReadStrategy* strategy) {strategy_ = strategy;}double readSensorData() {if (!strategy_) {throw std::runtime_error("Strategy not set!");}return strategy_->readData();}private:SensorReadStrategy* strategy_;
};

3.4 客户端调用

int main() {// 动态切换策略I2CReadStrategy i2cStrategy;AnalogReadStrategy analogStrategy;SensorManager manager(&i2cStrategy);std::cout << "I2C Read: " << manager.readSensorData() << std::endl;manager.setStrategy(&analogStrategy);std::cout << "Analog Read: " << manager.readSensorData() << std::endl;return 0;
}

4. OpenBMC 中的实际应用

4.1 日志记录策略

OpenBMC 的日志系统通常支持多种记录方式:

  • 本地日志(Journald)
  • 远程Syslog
  • DBus事件上报

代码示例

class LogStrategy {
public:virtual void log(const std::string& message) = 0;
};class JournaldLogStrategy : public LogStrategy {void log(const std::string& message) override {sd_journal_send("MESSAGE=%s", message.c_str());}
};class SyslogStrategy : public LogStrategy {void log(const std::string& message) override {syslog(LOG_INFO, "%s", message.c_str());}
};class Logger {
private:LogStrategy* strategy_;
public:void setStrategy(LogStrategy* strategy) { strategy_ = strategy; }void log(const std::string& message) { strategy_->log(message); }
};

4.2 固件升级策略

OpenBMC 支持多种固件升级方式:

  • TFTP 升级
  • HTTP 下载升级
  • Redfish 协议升级
class FirmwareUpgradeStrategy {
public:virtual void upgrade(const std::string& firmwarePath) = 0;
};class TFTPUpgradeStrategy : public FirmwareUpgradeStrategy {void upgrade(const std::string& firmwarePath) override {// TFTP 逻辑}
};class HTTPUpgradeStrategy : public FirmwareUpgradeStrategy {void upgrade(const std::string& firmwarePath) override {// HTTP 下载逻辑}
};

5. 策略模式的优缺点

✅ 优点

避免条件分支:减少 if-elseswitch-case 的滥用。
符合开闭原则(OCP):新增策略无需修改现有代码。
运行时动态切换:灵活调整算法行为(如OpenBMC日志策略切换)。

❌ 缺点

策略类数量可能爆炸(需合理设计)。
客户端必须了解所有策略(可通过工厂模式优化)。


6. 总结

策略模式在 OpenBMC 中的应用广泛,尤其适合算法多变、需动态切换的场景。
最佳实践

  • 结合工厂模式管理策略对象创建。
  • 使用智能指针(std::unique_ptr 避免内存泄漏。

适用场景
🔹 传感器数据采集
🔹 日志记录方式
🔹 固件升级协议
🔹 网络通信策略


📌 推荐阅读

  • 《Design Patterns: Elements of Reusable Object-Oriented Software》(GoF)
  • OpenBMC 源码:github.com/openbmc/openbmc

希望这篇博客对你理解策略模式及其在OpenBMC中的应用有所帮助! 🚀

参考链接:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/919210.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/919210.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【python实用小脚本-187】Python一键批量改PDF文字:拖进来秒出新文件——再也不用Acrobat来回导

Python一键批量改PDF文字&#xff1a;拖进来秒出新文件——再也不用Acrobat来回导 PDF文字替换, 批量导出, 零依赖转档, 一键完成, 瑞士军刀 故事开场&#xff1a;一把瑞士军刀救了周五下班的你 周五 18:00&#xff0c;老板甩来 50 份合同 PDF&#xff1a; “把里面的‘2023’全…

汽车后雾灯色度难达标?OAS 软件精准解决破瓶颈

汽车后雾灯案例分析简介汽车后雾灯是车辆在能见度较低的雾、雨、雪等恶劣天气条件下行驶时&#xff0c;向后方车辆传递警示信号的重要装置&#xff0c;其性能直接关系到车辆的后方安全。根据规定&#xff0c;红色信号灯需符合 CIE1931 标准&#xff0c;其色度坐标 X 值应在 0.6…

[系统架构设计师]架构设计专业知识(二)

[系统架构设计师]架构设计专业知识&#xff08;二&#xff09; 一.信息系统基础知识 1.信息系统概述 信息系统功能&#xff1a;输入&#xff0c;存储&#xff0c;处理&#xff0c;输出&#xff0c;控制 理查德.诺兰&#xff1a; 初始&#xff0c;传播&#xff0c;控制&#xff…

如果用ApiFox调用Kubernetes API,需要怎么设置证书?

针对Docker Desktop中Kubernetes访问报SSL/TLS信任关系错误的问题&#xff0c;以下是综合解决方案&#xff1a;要在Postman中调用Kubernetes API并设置证书&#xff0c;需按以下步骤操作&#xff1a;&#x1f510; 证书设置步骤‌提取证书文件‌从kubeconfig文件&#xff08;~/…

nodejs 路由/请求

//导入模块 const express require(express); //创建应用 const app express();//设置路由 app.get(/,(req,resp)>{//输出响应console.log(request coming.............);resp.json(req.headers); });app.get(/user/:id, (req, res) > {const userId req.params.id; …

Python 数据可视化:柱状图/热力图绘制实例解析

Python 数据可视化&#xff1a;柱状图绘制实例解析 一、引言 数据可视化是数据分析中至关重要的环节&#xff0c;它能将复杂的数据以直观的图形方式呈现&#xff0c;帮助我们更好地理解数据特征和规律。Python 拥有丰富的可视化库&#xff0c;其中 Matplotlib 是最常用的基础库…

API生命周期10阶段

一、策略规划&#xff08;Strategy Planning&#xff09; 核心任务&#xff1a;业务价值对齐、技术路线设计关键产出&#xff1a; API产品蓝图&#xff1a;定义业务领域边界&#xff08;如支付API域、用户API域&#xff09;治理规范&#xff1a;《API安全标准》《版本管理策略》…

UGUI源码剖析(9):布局的实现——LayoutGroup的算法与实践

UGUI源码剖析&#xff08;第九章&#xff09;&#xff1a;布局的实现——LayoutGroup的算法与实践 在前一章中&#xff0c;我们剖析了LayoutRebuilder是如何调度布局重建的。现在&#xff0c;我们将深入到布局核心&#xff0c;去看看那些具体的组件——LayoutGroup系列组件是如…

GitHub PR 提交流程

step1 在 GitHub 上 fork 目标仓库&#xff08;手动操作&#xff09; step2 将 fork 的目标仓库克隆到本地 git clone https://github.com/<your-username>/<repo-name>.git cd <repo-name>step3 与上游目标仓库建立链接 git remote add upstream https://gi…

矿物分类案列 (一)六种方法对数据的填充

目录 矿物数据项目介绍&#xff1a; 数据问题与处理方案&#xff1a; 数据填充策略讨论&#xff1a; 模型选择与任务类型&#xff1a; 模型训练计划&#xff1a; 一.数据集填充 1.读取数据 2.把标签转化为数值 3.把异常数据转化为nan 4.数据Z标准化 5.划分训练集测试…

vue:vue3的方法torefs和方法toref

在 Vue 3 的 Composition API 中,toRef 和 toRefs 是两个用于处理响应式数据的重要工具,它们专门用于从 reactive() 对象中提取属性并保持响应性。 toRef() 作用:将 reactive 对象的单个属性转换为一个 ref 对象,保持与源属性的响应式连接。 使用场景: 需要单独提取 rea…

Android 移动端 UI 设计:前端常用设计原则总结

在 Android 移动端开发中&#xff0c;优秀的 UI 设计不仅需要视觉上的美观&#xff0c;更需要符合用户习惯、提升操作效率的设计逻辑。前端 UI 设计原则是指导开发者将功能需求转化为优质用户体验的核心准则&#xff0c;这些原则贯穿于布局结构、交互反馈、视觉呈现等各个环节。…

计算机网络 TCP三次握手、四次挥手超详细流程【报文交换、状态变化】

TCP&#xff08;传输控制协议&#xff09;是互联网最重要的协议之一&#xff0c;它保证了数据的可靠、有序传输。连接建立时的“三次握手”和连接关闭时的“四次挥手”是其核心机制&#xff0c;涉及特定的报文交换和状态变化。 一、TCP 三次握手&#xff08;Three-Way Handshak…

使用Applications Manager进行 Apache Solr 监控

Apache Solr 为一些对性能极为敏感的环境提供搜索支持&#xff1a;电子商务、企业应用、内容门户和内部知识系统。因此&#xff0c;当出现延迟增加或结果不一致的情况时&#xff0c;用户会立刻察觉。而当这些问题未被发现时&#xff0c;情况会迅速恶化。 Apache Solr 基于 Apa…

Shell脚本-for循环语法结构

一、前言在 Linux Shell 脚本编程中&#xff0c;for 循环 是最常用的控制结构之一&#xff0c;用于重复执行一段命令&#xff0c;特别适用于处理列表、文件、数字序列等场景。本文将详细介绍 Shell 脚本中 for 循环的各种语法结构&#xff0c;包括&#xff1a;✅ 经典 for in 结…

记SpringBoot3.x + Thymeleaf 项目实现(MVC架构模式)

目录 前言 一、创建SpringBoot项目 1. 创建项目 2. 运行项目 二、连接数据库实现登录 1. pom.xml文件引入依赖包 2. application.yml文件配置 3. 数据持久层&#xff0c;mybatis操作映射 4. Service接口及实现 5. Controller代码 6. Thymeleaf页面登录 7. 运行项目…

Java 导出word 实现表格内插入图表(柱状图、折线图、饼状图)--可编辑数据

表格内插入图表导出效果表格内图表生成流程分析 核心问题与解决方案 问题 Word 图表作为独立对象&#xff0c;容易与文本分离位置难以精确控制&#xff0c;编辑时容易偏移缺乏与表格数据的关联性 解决方案 直接嵌入&#xff1a;将图表嵌入表格单元格&#xff0c;确保数据关联精…

北京JAVA基础面试30天打卡12

1.MySQL中count(*)、count(I)和count(字段名)有什么区别&#xff1f; 1**.COUNT ()**是效率最高的统计方式&#xff1a;COUNT()被优化为常量&#xff0c;直接统计表的所有记录数&#xff0c;不依赖字段内容&#xff0c;开销最低。推荐在统计整个表的记录数时使用。 2.**COUNT(1…

【AI】——结合Ollama、Open WebUI和Docker本地部署可视化AI大语言模型

&#x1f3bc;个人主页&#xff1a;【Y小夜】 &#x1f60e;作者简介&#xff1a;一位双非学校的大三学生&#xff0c;编程爱好者&#xff0c; 专注于基础和实战分享&#xff0c;欢迎私信咨询&#xff01; &#x1f386;入门专栏&#xff1a;&#x1f387;【MySQL&#xff0…

RAG学习(二)

构建索引 一、向量嵌入 向量嵌入&#xff08;Embedding&#xff09;是一种将真实世界中复杂、高维的数据对象&#xff08;如文本、图像、音频、视频等&#xff09;转换为数学上易于处理的、低维、稠密的连续数值向量的技术。 想象一下&#xff0c;我们将每一个词、每一段话、…