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

设备数据解析设计模式

最佳实践:采用 策略模式(Strategy Pattern) + 工厂模式(Factory Pattern) 组合,实现高扩展、高可维护的多设备数据解析。

1. 策略模式

封装不同设备的解析算法

// 策略接口:所有设备类型的数据解析器都必须实现
public interface DeviceDataParseStrategy {/*** 解析设备上报的原始字节数据* @param rawData  设备上报的原始字节数组* @param deviceId 设备ID(卡号)* @return 统一的数据对象*/DeviceDataDTO parse(byte[] rawData, String deviceId);
}// 示例:设备类型A的解析策略
@Component("typeADataParseStrategy")
public class TypeADataParseStrategy implements DeviceDataParseStrategy {@Overridepublic DeviceDataDTO parse(byte[] rawData, String deviceId) {DeviceDataDTO dto = new DeviceDataDTO();dto.setDeviceId(deviceId);dto.setReceiveTime(DateUtil.now()); // Hutool 获取当前时间// 类型A专属解析逻辑(示例)// 假设协议:偏移0-1字节为亮度,2-3字节为电压(0.1V单位)int brightness = ByteUtil.bytesToShort(rawData, 0);         // Hutool 字节工具double voltage = ByteUtil.bytesToShort(rawData, 2) / 10.0;dto.getExtData().put("brightness", brightness);dto.getExtData().put("voltage", voltage);// 可继续解析电流、故障码等...return dto;}
}// 示例:设备类型B的解析策略(协议完全不同)
@Component("typeBDataParseStrategy")
public class TypeBDataParseStrategy implements DeviceDataParseStrategy {@Overridepublic DeviceDataDTO parse(byte[] rawData, String deviceId) {DeviceDataDTO dto = new DeviceDataDTO();dto.setDeviceId(deviceId);dto.setReceiveTime(DateUtil.now());// 类型B专属解析逻辑(示例)// 假设使用IEEE754浮点数表示开关状态和温度int status = rawData[0] & 0xFF;float temperature = ByteUtil.bytesToFloat(rawData, 1);dto.getExtData().put("switchStatus", status == 1 ? "ON" : "OFF");dto.getExtData().put("temperature", temperature);return dto;}
}

2. 工厂模式

根据设备类型动态获取解析策略

@Service
public class DeviceDataParseFactory {// Spring 自动注入所有解析策略实现,key 为 Bean 名称private final Map<String, DeviceDataParseStrategy> strategyMap;public DeviceDataParseFactory(Map<String, DeviceDataParseStrategy> strategyMap) {this.strategyMap = strategyMap;}public DeviceDataParseStrategy getStrategy(String deviceType) {// 使用 Hutool 优化命名规则String beanName = StrUtil.lowerFirst(deviceType) + "DataParseStrategy";DeviceDataParseStrategy strategy = strategyMap.get(beanName);if (strategy == null) {throw new UnsupportedOperationException("不支持的设备类型解析: " + deviceType);}return strategy;}
}
  1. 在 Service 层统一调用(推荐方式)
@Service
public class DeviceDataService {@Autowiredprivate DeviceDataParseFactory parseFactory;/*** 处理设备上报数据* @param deviceType 设备类型* @param rawData    原始字节数据* @param deviceId   设备ID*/public void handleUploadData(String deviceType, byte[] rawData, String deviceId) {// 1. 使用工厂 + 策略动态解析// 通过工厂根据设备类型获取对应的解析策略对象// 体现了工厂模式:运行时自动选择正确实现// 体现了策略模式:不同设备使用完全独立的解析算法DeviceDataParseStrategy strategy = parseFactory.getStrategy(deviceType);// 调用策略的 parse 方法执行专属解析逻辑// 返回统一DTO,便于后续统一存储、展示、告警等业务处理DeviceDataDTO dto = strategy.parse(rawData, deviceId);// 2. 统一业务处理(存储、告警、统计等)// saveToDatabase(dto);// checkAlarm(dto);log.info("设备数据解析成功 deviceId={} type={} data={}", deviceId, deviceType, dto.getExtData());}}
http://www.zskr.cn/news/182992.html

相关文章:

  • 模拟登录验证三次机会 - GLORY-TO-THE
  • Miniconda-Python3.10镜像中配置国内镜像源的完整教程
  • 吴恩达深度学习课程四:计算机视觉 第四周:卷积网络应用 (二) 图像风格转换
  • 数据科学与大数据技术综合设计——多源异构数据采集与融合应用综合实践小组分工_102302107林诗樾
  • 程序员必备!一款免费的(原文/译文)AI 双语对照网页翻译插件,信息获取效率飙升!
  • 提示工程架构师指南:Agentic AI医疗应用的版本控制与迭代管理最佳实践
  • 【Azure Bot Service】在机器人服务中如何调用LLM来回答问题呢?
  • 基于Miniconda的PyTorch安装教程:专为GPU加速设计的轻量环境
  • 使用Miniconda创建独立环境避免PyTorch与TensorFlow版本冲突
  • 2025.10.25-26
  • 远程日志采集:集中管理多个Miniconda容器的日志
  • 【技术复盘】 设备跨机迁移后的 ARP 缓存连通性故障分析
  • Docker port查看Miniconda容器端口映射情况
  • PyTorch安装教程GPU版:基于Miniconda-Python3.10镜像的一键部署方案
  • Docker cp在宿主机与Miniconda容器间传输文件
  • Miniconda环境去重:合并重复的依赖项减少冗余
  • Java20243718今日学习!
  • 补一下学了啥,直接提交了。。。
  • Docker build cache提高Miniconda镜像构建效率
  • Python虚拟环境最佳实践:Miniconda取代传统venv方案
  • AI应用架构师重塑智能家居生态系统AI应用格局
  • Markdown语法进阶:制作美观的技术文档记录环境搭建过程
  • 拆分的第一性原理——按业务域、一致性与团队边界来切,避免“为拆而拆”
  • AUTO TECH China 2026 广州国际汽车底盘系统技术展览会
  • 学长亲荐10个AI论文软件,继续教育论文写作必备!
  • 【遗传算法(GA)和模拟退火(SA)对翼型升阻比进行优化】基于神经网络和无导数算法的翼型优化附Matlab代码
  • 读书笔记5-11.13
  • 程序员必看!收藏这篇:知识图谱如何解决大模型的幻觉问题
  • Markdown表格对比:Miniconda与Anaconda功能差异一览
  • AI大模型时代程序员生存指南:从职业转型到高薪岗位的完整路径_大龄程序员想转行大模型,应该往哪个方向转?