Java 23 种设计模式:从踩坑到精通 | 番外:命令模式 —— 仓储设备控制实战
Java 23 种设计模式从踩坑到精通 | 番外命令模式 —— 仓储设备控制实战摘要命令模式将“请求”封装为对象从而让你可以用不同的请求对客户端参数化、对请求排队或记录日志并天然支持撤销操作。本文结合智能仓储设备控制系统的场景完整展示如何用命令模式实现对传送带、分拣机等设备的远程控制和撤销操作并与策略模式深度对比帮你掌握“将行为对象化”的设计精髓。️本文阅读地图3 分钟速览为什么设备控制不能直接调用设备方法✅ 命令模式核心角色调用者、抽象命令、具体命令、接收者手写仓储调度中心启动/停止设备支持多步撤销 命令 vs 策略行为封装 vs 算法替换 面试必问“命令模式和策略模式有什么区别Runnable用了哪个”《Java 23 种设计模式从踩坑到精通》开篇系列介绍与目录 正篇命令模式 Command —— 把操作封装成对象实现撤销与排队 当前番外 · 命令模式 × 仓储设备控制 返回系列总目录1. 仓储设备控制的痛点在智能仓库中有传送带、分拣机、堆垛机等多种设备。操作员通过一个中央控制台来管理这些设备的启停。如果直接在控制台类中调用设备方法if(button.equals(start_conveyor)){conveyor1.start();}elseif(button.equals(stop_sorter)){sorter1.stop();}这种写法将控制台与具体设备紧耦合新增设备或修改操作逻辑都需要修改控制台代码。更复杂的是操作员希望控制台支持撤销上一步操作和一键批量操作——这用if-else几乎无法优雅实现。命令模式的解决思路将“启动设备”和“停止设备”这些操作封装为独立的命令对象控制台只持有命令并触发执行不关心命令内部是哪个设备、如何执行。所有执行过的命令记录在栈中撤销时只需弹出栈顶并调用undo()。1.1 你的场景该不该用命令模式判断标准是 → 用命令模式否 → 用其他方式需要将操作的发起者与执行者解耦✅❌需要支持撤销/重做、命令队列、宏命令✅❌需要在运行时动态指定、排列或执行请求✅❌只有简单的调用无需撤销或排队❌直接调用即可2. 命令模式 UML仓储设备控制场景3. 完整源码实现3.1 抽象命令接口 (Command)/** * 抽象命令声明执行和撤销操作 */publicinterfaceCommand{voidexecute();voidundo();}白话所有命令都必须能“执行”和“撤销”。这就是命令模式的灵魂——命令不仅是“做什么”还要知道“怎么反悔”。3.2 接收者仓库设备基类 (WarehouseDevice)/** * 接收者仓库设备基类 */publicabstractclassWarehouseDevice{protectedStringname;protectedbooleanisRunning;publicWarehouseDevice(Stringname){this.namename;this.isRunningfalse;}publicabstractvoidstart();publicabstractvoidstop();publicStringgetName(){returnname;}publicbooleanisRunning(){returnisRunning;}}3.3 具体接收者传送带 (ConveyorBelt)/** * 具体接收者传送带设备 */publicclassConveyorBeltextendsWarehouseDevice{publicConveyorBelt(Stringname){super(name);}Overridepublicvoidstart(){isRunningtrue;System.out.println( name 启动传送带开始运转速度 1.5m/s);}Overridepublicvoidstop(){isRunningfalse;System.out.println( name 停止传送带已关闭);}}3.4 具体接收者分拣机 (SortingMachine)/** * 具体接收者分拣机设备 */publicclassSortingMachineextendsWarehouseDevice{publicSortingMachine(Stringname){super(name);}Overridepublicvoidstart(){isRunningtrue;System.out.println( name 启动分拣机开始工作处理能力 500件/分钟);}Overridepublicvoidstop(){isRunningfalse;System.out.println( name 停止分拣机已关闭);}}白话这些设备就是“真正干活的”——传送带知道怎么启动和停止自己分拣机也知道。它们不关心是谁发出的指令。3.5 具体命令启动/停止设备命令/** * 具体命令启动设备 */publicclassStartDeviceCommandimplementsCommand{privateWarehouseDevicedevice;publicStartDeviceCommand(WarehouseDevicedevice){this.devicedevice;}Overridepublicvoidexecute(){device.start();}Overridepublicvoidundo(){device.stop();}}/** * 具体命令停止设备 */publicclassStopDeviceCommandimplementsCommand{privateWarehouseDevicedevice;publicStopDeviceCommand(WarehouseDevicedevice){this.devicedevice;}Overridepublicvoidexecute(){device.stop();}Overridepublicvoidundo(){device.start();}}白话启动命令的撤销就是停止停止命令的撤销就是重新启动——这是最简洁的撤销实现。3.6 调用者设备调度中心 (DeviceScheduler)importjava.util.Stack;/** * 调用者设备调度中心遥控器 */publicclassDeviceScheduler{privateStackCommandcommandHistorynewStack();publicvoidexecuteCommand(Commandcommand){command.execute();commandHistory.push(command);System.out.println( ✅ 命令已执行当前历史记录commandHistory.size() 条\n);}publicvoidundoLastCommand(){if(commandHistory.isEmpty()){System.out.println( ⚠️ 无命令可撤销\n);return;}CommandcommandcommandHistory.pop();command.undo();System.out.println( ↩️ 已撤销上一个命令剩余历史记录commandHistory.size() 条\n);}}白话调度中心就像遥控器——它只管按下“执行”或“撤销”按钮完全不知道控制的是传送带还是分拣机。所有执行过的命令压入栈中撤销时弹出栈顶。3.7 客户端测试publicclassClient{publicstaticvoidmain(String[]args){System.out.println( 智能仓储设备控制系统命令模式\n);ConveyorBeltconveyor1newConveyorBelt(传送带A-1);ConveyorBeltconveyor2newConveyorBelt(传送带B-2);SortingMachinesorter1newSortingMachine(分拣机S-1);DeviceSchedulerschedulernewDeviceScheduler();// 场景1~3正常执行scheduler.executeCommand(newStartDeviceCommand(conveyor1));scheduler.executeCommand(newStartDeviceCommand(sorter1));scheduler.executeCommand(newStopDeviceCommand(conveyor1));// 场景4撤销停止 → 传送带恢复运行scheduler.undoLastCommand();// 场景5批量启动scheduler.executeCommand(newStartDeviceCommand(conveyor2));scheduler.executeCommand(newStartDeviceCommand(sorter1));// 场景6紧急连续撤销scheduler.undoLastCommand();scheduler.undoLastCommand();}}4. 运行结果 智能仓储设备控制系统命令模式 传送带A-1 启动传送带开始运转速度 1.5m/s ✅ 命令已执行当前历史记录1 条 分拣机S-1 启动分拣机开始工作处理能力 500件/分钟 ✅ 命令已执行当前历史记录2 条 传送带A-1 停止传送带已关闭 ✅ 命令已执行当前历史记录3 条 传送带A-1 启动传送带开始运转速度 1.5m/s ↩️ 已撤销上一个命令剩余历史记录2 条 传送带B-2 启动传送带开始运转速度 1.5m/s ✅ 命令已执行当前历史记录3 条 分拣机S-1 启动分拣机开始工作处理能力 500件/分钟 ✅ 命令已执行当前历史记录4 条 分拣机S-1 停止分拣机已关闭 ↩️ 已撤销上一个命令剩余历史记录3 条 传送带B-2 停止传送带已关闭 ↩️ 已撤销上一个命令剩余历史记录2 条5. 核心角色回顾角色职责对应代码Command定义执行和撤销的接口CommandConcreteCommand绑定接收者与动作StartDeviceCommand/StopDeviceCommandReceiver真正执行具体业务逻辑ConveyorBelt/SortingMachineInvoker持有命令触发执行与撤销DeviceScheduler6. 命令模式 vs 策略模式对比项命令模式策略模式意图封装请求为对象支持撤销/队列封装算法族使其可相互替换是否支持撤销✅ 核心特性❌ 通常不需要典型应用Runnable、仓储设备控制、事务回滚Comparator、支付方式、促销策略一句话记忆命令模式是“行为对象化”——把操作变成对象能执行也能撤销策略模式是“算法对象化”——把算法变成对象能灵活替换。7. 命令模式的优缺点优点缺点调用者与接收者完全解耦每个命令一个类命令多时类数量膨胀天然支持撤销/重做、宏命令设计复杂度增加角色较多符合开闭原则新增命令无需修改现有代码命令对象持有状态时需注意线程安全8. 六大设计原则体现原则体现单一职责命令只负责请求封装设备只负责执行开闭原则新增命令无需修改调度中心或设备里氏替换所有命令可替换Command接口依赖倒置调度中心依赖抽象Command接口隔离Command只有execute()和undo()迪米特法则调度中心只与命令交互不知设备细节附 命令模式 UML源码仓储设备控制场景startuml title Java 23 种设计模式从踩坑到精通 footer 折哥 | 智能物流与Java实战 1. 全局样式配置 skinparam backgroundColor #FEFEFE skinparam shadowing false skinparam classBorderColor #333333 skinparam classFontColor #1A1A1A skinparam classFontSize 14 skinparam noteFontSize 12 skinparam noteFontColor #555555 skinparam arrowColor #555555 skinparam classBackgroundColor #F9F9F9 skinparam interface { BackgroundColor #E8F5E9 BorderColor #2E7D32 } 2. 调用者遥控器/调度中心 class Invoker { - command : Command setCommand(Command) executeCommand() undoLastCommand() } note right of Invoker b调用者调度中心/b -- 持有命令对象触发执行 不关心具体执行细节 支持撤销操作 end note 3. 抽象命令 interface Command { execute() undo() } note right of Command b抽象命令/b -- 声明执行和撤销操作 所有具体命令都实现此接口 end note 4. 具体命令开启 class LightOnCommand implements Command { - light : Light execute() undo() } note right of LightOnCommand b具体命令开启/b -- 持有接收者引用 执行时调用接收者的on() 撤销时调用接收者的off() end note 5. 具体命令关闭 class LightOffCommand implements Command { - light : Light execute() undo() } note right of LightOffCommand b具体命令关闭/b -- 持有接收者引用 执行时调用接收者的off() 撤销时调用接收者的on() end note 6. 接收者 class Light { on() off() } note right of Light b接收者执行者/b -- 真正执行具体业务逻辑 与命令解耦无需知道谁调用 end note 7. 关系连线 Invoker o-- Command : 持有命令 LightOnCommand -- Light : 调用 LightOffCommand -- Light : 调用 LightOnCommand ..| Command : 实现 LightOffCommand ..| Command : 实现 enduml 《Java 23 种设计模式从踩坑到精通》快速导航开篇系列介绍与目录正篇命令模式 Command —— 把操作封装成对象实现撤销与排队当前番外 · 命令模式 × 仓储设备控制你在这里创建型模式汇总结构型模式汇总行为型模式汇总 关注《Java 23 种设计模式从踩坑到精通》用 25 篇文章彻底吃透设计模式。福利预告全系列代码及 UML 源码将在完结时统一打包开放点击「关注」「收藏」第一时间获取。 除了设计模式我也在深挖智能物流实战WMS、托盘调度、机器学习落地。欢迎点击头像看看专栏 《出版社物流WMS智能调度实战》、《电商多平台电子面单对接实战》。技术相通思路可鉴。

相关新闻

【上篇】从“恒温器“到“AlphaGo“:一文读懂AI Agent的定义、演进与分类

【上篇】从“恒温器“到“AlphaGo“:一文读懂AI Agent的定义、演进与分类

文章目录一、到底什么是智能体(Agent)二、智能体的进化阶梯:从「膝跳反射」到「自学成才」🔹 第一级:简单反射智能体 —— 「本能膝跳反射」🔹 第二级:基于模型的反射智能体 —— 「老司机盲开」…

2026/8/3 1:47:19阅读更多 →
JPEXS免费Flash反编译器终极指南:轻松解析SWF文件并提取资源

JPEXS免费Flash反编译器终极指南:轻松解析SWF文件并提取资源

JPEXS免费Flash反编译器终极指南:轻松解析SWF文件并提取资源 【免费下载链接】jpexs-decompiler JPEXS Free Flash Decompiler 项目地址: https://gitcode.com/gh_mirrors/jp/jpexs-decompiler 你是否曾经遇到过这样的情况:手头有一个珍贵的Flash…

2026/8/3 1:47:19阅读更多 →
8月福利来袭!新人必领8元无门槛优惠券,

8月福利来袭!新人必领8元无门槛优惠券,

8月福利来袭!发福利啦!官方最新口令,输入下方图片的口令弹出后,点击领8元通用立减券!这是2026年8月最新活动!也是最新福利,以下是具体的领取方法,亲测有效呦!领取后下单&…

2026/8/3 1:47:19阅读更多 →
SpringBoot移动图书商城系统开发实战

SpringBoot移动图书商城系统开发实战

1. 项目概述:SpringBoot驱动的移动端图书商城系统这个基于SpringBoot框架开发的移动图书销售管理系统,本质上是一个面向移动互联网时代的全功能在线书城解决方案。作为一名经历过多个电商项目实战的开发者,我认为这类系统的核心价值在于将传统…

2026/8/3 3:12:32阅读更多 →
Vue+SSM构建考研互助平台的技术实践与优化

Vue+SSM构建考研互助平台的技术实践与优化

1. SSM278考研互助辅导平台Vue版项目概述这个基于Vue.js的前端项目是为考研学子打造的在线互助学习平台,后端采用SSM(SpringSpringMVCMyBatis)架构。作为2023年考研季的热门开源项目,它解决了传统考研论坛交互性差、功能单一的问题。我在开发过程中发现&…

2026/8/3 3:12:32阅读更多 →
微软终于松口:Windows 11 要为 8GB 内存“瘦身“了

微软终于松口:Windows 11 要为 8GB 内存“瘦身“了

微软最近在一篇官方博客中透露了 Windows 11 质量改进的最新动向。文章末尾埋了一句看似平淡、实则分量不轻的话——团队将专门针对配备 8GB 及以上内存的设备做深度优化。这句话的潜台词很直白:微软终于承认,8GB 内存已经成了 Windows 11 的"及格线…

2026/8/3 3:12:32阅读更多 →
【高阶·融合】如何以可观测性驱动 AI 安全合规持续验证:从遥测采集到机器可验证证据的七层闭环架构

【高阶·融合】如何以可观测性驱动 AI 安全合规持续验证:从遥测采集到机器可验证证据的七层闭环架构

【高阶融合】如何以可观测性驱动 AI 安全合规持续验证:从遥测采集到机器可验证证据的七层闭环架构 专栏:《AI 工程与安全深度实战》 第12轮第3篇 核心痛点:安全合规审计一年一次、AI 推理请求一秒千次——当合规停留在文档自评而遥测数据无法自动映射到法规条款时,"最…

2026/8/3 3:12:32阅读更多 →
GitLab惊现高危RCE漏洞:普通用户竟能直接接管服务器?深度解析Oj解析器内存损坏攻击链

GitLab惊现高危RCE漏洞:普通用户竟能直接接管服务器?深度解析Oj解析器内存损坏攻击链

2026年6月,网络安全研究团队depthfirst抛出了一枚重磅炸弹——他们成功构建了一套针对GitLab的远程代码执行(RCE)概念验证程序。这个漏洞的可怕之处在于,攻击者甚至不需要管理员权限,也不需要接触CI流水线,…

2026/8/3 3:12:32阅读更多 →
【面试题-算法】----面试经典算法题|数 30 游戏,谁数到 30 谁输,必胜策略解析[特殊字符]

【面试题-算法】----面试经典算法题|数 30 游戏,谁数到 30 谁输,必胜策略解析[特殊字符]

前言 很多算法面试会拿**数30游戏**作为思维思考题,考察逆向推理能力。 游戏规则先梳理清楚: ✅ 两人轮流从0开始依次数数 ✅ 每人一轮可以数 1~3 个连续数字 ✅ 谁先数到30,谁直接输 目标:找出一套策略,保证稳定取胜。…

2026/8/3 3:10:32阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/3 0:29:53阅读更多 →
限时公开!某头部SaaS公司内部AI模板工厂架构文档(含5类行业模板源码+性能压测报告)

限时公开!某头部SaaS公司内部AI模板工厂架构文档(含5类行业模板源码+性能压测报告)

更多请点击: https://intelliparadigm.com 第一章:AI模板批量生成的核心价值与落地全景 AI模板批量生成正从实验性工具演进为现代软件工程的关键基础设施。它通过语义理解、上下文感知与结构化约束,将重复性高、模式明确的代码/文档/配置生成…

2026/8/3 0:33:53阅读更多 →
如何快速找回消失的网页:Web Archives浏览器扩展终极指南

如何快速找回消失的网页:Web Archives浏览器扩展终极指南

如何快速找回消失的网页:Web Archives浏览器扩展终极指南 【免费下载链接】web-archives Browser extension for viewing archived and cached versions of web pages, available for Chrome, Edge and Safari 项目地址: https://gitcode.com/gh_mirrors/we/web-a…

2026/8/3 0:20:37阅读更多 →
3个让你工作效率翻倍的Umi-OCR实战技巧:免费离线文字识别完全指南

3个让你工作效率翻倍的Umi-OCR实战技巧:免费离线文字识别完全指南

3个让你工作效率翻倍的Umi-OCR实战技巧:免费离线文字识别完全指南 【免费下载链接】Umi-OCR OCR software, free and offline. 开源、免费的离线OCR软件。支持截屏/批量导入图片,PDF文档识别,排除水印/页眉页脚,扫描/生成二维码。…

2026/8/3 0:00:32阅读更多 →
[具身智能-181]:PC+服务器+具身机器人:构建具身智能从仿真到量产的闭环迭代混合架构

[具身智能-181]:PC+服务器+具身机器人:构建具身智能从仿真到量产的闭环迭代混合架构

PC服务器具身机器人:构建具身智能从仿真到量产的闭环迭代混合架构一、前言:具身智能需要“混合算力闭环系统”传统人工智能依赖云端静态数据集训练,不具备物理交互能力,无法适应真实世界的不确定性。具身智能(Embodied…

2026/8/3 0:00:32阅读更多 →
[具身智能-181]:大分布式通信模型对比:看懂为什么 DDS 是 ROS2 底层通信最优解

[具身智能-181]:大分布式通信模型对比:看懂为什么 DDS 是 ROS2 底层通信最优解

前言构建机器人、具身智能这类分布式实时系统,通信底座直接决定整套系统的实时性、容错性、组网能力。分布式领域长期存在 4 类经典通信架构:点对点模式、Broker 中间代理模式、广播模式、以数据为中心(DDS)模式。很多开发者疑惑&…

2026/8/3 0:00:32阅读更多 →
无损视频剪辑终极指南:如何实现快速高效的多媒体处理

无损视频剪辑终极指南:如何实现快速高效的多媒体处理

无损视频剪辑终极指南:如何实现快速高效的多媒体处理 【免费下载链接】lossless-cut The swiss army knife of lossless video/audio editing 项目地址: https://gitcode.com/gh_mirrors/lo/lossless-cut 在数字媒体创作领域,视频编辑处理的质量损…

2026/8/3 2:32:59阅读更多 →
AI辅助本科论文写作:8大工具评测与高效使用指南

AI辅助本科论文写作:8大工具评测与高效使用指南

1. 本科生论文写作的AI辅助现状本科毕业论文是每个大学生必须跨越的一道坎。记得我当年写论文时,光是文献检索就花了整整两周时间,打印的参考文献堆满了半个书桌。如今AI技术的发展为学术写作带来了革命性变化,合理使用这些工具可以节省80%以…

2026/8/3 2:33:01阅读更多 →
如何快速配置大麦自动抢票系统:从零开始搭建Python抢票助手

如何快速配置大麦自动抢票系统:从零开始搭建Python抢票助手

如何快速配置大麦自动抢票系统:从零开始搭建Python抢票助手 【免费下载链接】ticket-purchase 大麦自动抢票,支持人员、城市、日期场次、价格选择 项目地址: https://gitcode.com/GitHub_Trending/ti/ticket-purchase 还在为抢不到热门演唱会门票…

2026/8/3 2:33:04阅读更多 →