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

设备指令下发设计模式

策略模式(Strategy Pattern) + 工厂模式(Factory Pattern) + 命令模式(Command Pattern)

1. 策略模式

封装不同设备的指令生成算法

// 策略接口
public interface CommandGenerateStrategy {/*** 生成特定设备的下发指令字节数组* @param cmdType 指令类型(如开关、查询等)* @param params  参数* @param deviceId 设备ID* @return 指令字节数组*/byte[] generate(String cmdType, Map<String, Object> params, String deviceId);
}// 示例:设备类型A的指令生成策略
@Component("typeACommandStrategy")
public class TypeACommandStrategy implements CommandGenerateStrategy {@Overridepublic byte[] generate(String cmdType, Map<String, Object> params, String deviceId) {// 类型A专属协议组装逻辑,使用 Hutool 处理字节操作// 示例:ByteUtil、StrUtil 等return new byte[] { /* 类型A协议字节 */ };}
}// 示例:设备类型B的指令生成策略
@Component("typeBCommandStrategy")
public class TypeBCommandStrategy implements CommandGenerateStrategy {// 类型B专属逻辑
}

2. 工厂模式

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

@Service
public class CommandGenerateFactory {// Spring 自动注入所有策略实现,key 为 Bean 名称private final Map<String, CommandGenerateStrategy> strategyMap;public CommandGenerateFactory(Map<String, CommandGenerateStrategy> strategyMap) {this.strategyMap = strategyMap;}public CommandGenerateStrategy getStrategy(String deviceType) {// 使用 Hutool 优化字符串处理String beanName = StrUtil.lowerFirst(deviceType) + "CommandStrategy";CommandGenerateStrategy strategy = strategyMap.get(beanName);if (strategy == null) {throw new UnsupportedOperationException("不支持的设备类型: " + deviceType);}return strategy;}
}

3. 命令模式

将一次下发封装为命令对象,支持高级特性

// 命令接口
public interface DeviceCommand {void execute();           // 执行下发void undo();              // 可选:撤销指令String getCommandId();    // 获取指令唯一ID,用于追踪
}public class SendDeviceCommand implements DeviceCommand {private final String commandId = IdUtil.simpleUUID(); // Hutool 生成简洁UUIDprivate final String deviceType;private final String cmdType;private final Map<String, Object> params;private final String deviceId;private final CommandGenerateFactory factory;private final CommunicationService commService; // 通信服务(如MQTT、Netty等)private byte[] generatedBytes; // 缓存生成的指令public SendDeviceCommand(String deviceType, String cmdType,Map<String, Object> params, String deviceId,CommandGenerateFactory factory, CommunicationService commService) {this.deviceType = deviceType;this.cmdType = cmdType;this.params = params;this.deviceId = deviceId;this.factory = factory;this.commService = commService;}@Overridepublic void execute() {// 1. 使用工厂 + 策略生成指令//使用工厂方法,根据设备类型获取对应的指令策略类CommandGenerateStrategy strategy = factory.getStrategy(deviceType);//调用策略的生成指令类generatedBytes = strategy.generate(cmdType, params, deviceId);// 2. 通过通信层实际下发commService.send(deviceId, generatedBytes);// 3. 记录日志(可落库)log.info("指令下发成功 commandId={} deviceId={} cmdType={}", commandId, deviceId, cmdType);}@Overridepublic void undo() {// 可选实现:发送反向指令}@Overridepublic String getCommandId() {return commandId;}
}

4. Service 层统一调用

@Service
public class DeviceCommandService {@Autowiredprivate CommandGenerateFactory factory;@Autowiredprivate CommunicationService commService;// 同步立即下发(简单场景)public void sendImmediately(String deviceType, String cmdType,Map<String, Object> params, String deviceId) {DeviceCommand command = new SendDeviceCommand(deviceType, cmdType, params, deviceId, factory, commService);command.execute();}// 异步队列下发(生产推荐)public void sendAsync(String deviceType, String cmdType,Map<String, Object> params, String deviceId) {DeviceCommand command = new SendDeviceCommand(deviceType, cmdType, params, deviceId, factory, commService);// 放入消息队列(如 RocketMQ、RabbitMQ)或线程池commandQueue.offer(command); // 或 asyncExecutor.execute(command::execute);}
}
http://www.jsqmd.com/news/173126/

相关文章:

  • HttpWebRequest 进行异步Post 网络访问/(Task/async/await)代码实现
  • 深入剖析Tycoon 2FA钓鱼攻击套件:绕过双因素认证的技战术
  • Keil单片机编程软件常见文件介绍
  • Android 命令行打包 APK 完全指南|极速构建不求人
  • 安卓 手机直接去手机wifi设置页面的方法
  • 本地项目上传 GitHub 私有库:GitHub CLI 与 Git 原生双方案详解
  • 2025最新!专科生必看!8款AI论文软件测评,写毕业论文不再愁
  • [STM32C0] 【STM32C092RC 测评】ADC
  • Markdown 编辑器技术调研
  • LangChan4j在SpringBoot配置并且接入模型
  • 如何跟上当今AI高速发展的步伐
  • Linux库的原理与ELF文件
  • 掌控模型生态:ZGI 多模型网关,拒绝被单一供应商锁定
  • 辞别2025:在不确定中锚定确定,在喧嚣里守护清醒
  • [STM32C0] 【STM32C092RC 测评】GPIO操作
  • Java毕设选题推荐:基于SpringBoot社区医疗预约挂号平台的设计与实现基于SpringBoot + Vue的医院预约挂号系统的设计与实现【附源码、mysql、文档、调试+代码讲解+全bao等】
  • 大数据时代,为什么每个企业都需要BI工具?深度解析
  • C语言随堂笔记-10
  • [STM32C0] 【STM32C092RC 测评】+ 03 板载串口2输出测试
  • 个人知识库新选择
  • A.每日一题——2402. 会议室 III
  • 2026最新品牌环保板材厂商top10推荐!山东等地优质公司及生产厂家选择指南,ENF级环保与创新服务双优品牌推荐 - 全局中转站
  • c编译器并不难,Turbo c编译器介绍(上篇)
  • [STM32C0] 【STM32C092RC 测评】+08 定时器1输出可变脉宽
  • 2000-2024年各省、地级市银行竞争度HHI数据
  • HttpWebRequest 进行异步Post 网络访问/数据流形式获取数据(Task/async/await)的代码简单实现
  • 2026年数据可视化工具首选!万维易源(DataGear)使用指南
  • Dify MCP 接入踩坑实录:notifications/initialized 的终极解法
  • 2025年市面上靠谱的内螺纹法兰选哪家怎么选择,方法兰/分体法兰/SAE法兰/扩口法兰,内螺纹法兰选哪家推荐排行 - 品牌推荐师
  • 翻译:Akin 的航天器设计法则