如何使用Java命令模式实现业务请求的排队记录与撤销操作
作者:暮色微凉
时间:2026-07-01
浏览:0
Ja va命令模式通过把每个请求封装成独立对象,实现了请求发起者与执行者的彻底解耦。它天然支持排队、日志记录和撤销操作——核心组件包括Command接口(定义execute和undo)、无状态命令类、统一调度的Invoker,以及基于快照的并发安全回滚机制。可以说,这套模式非常适合处理业务请求的排队
Ja va命令模式通过把每个请求封装成独立对象,实现了请求发起者与执行者的彻底解耦。它天然支持排队、日志记录和撤销操作——核心组件包括Command接口(定义execute和undo)、无状态命令类、统一调度的Invoker,以及基于快照的并发安全回滚机制。可以说,这套模式非常适合处理业务请求的排队、记录和撤销场景。

下面从几个关键环节拆解具体实现方式。
命令接口与基础实现
统一的命令接口是整套模式的基石,需要包含执行(execute)和撤销(undo)两个方法:
- 所有具体业务命令都实现该接口,比如“创建订单”“修改用户信息”“扣减库存”
- 每个命令对象内部保存执行所需参数(如订单ID、用户ID、数量),避免依赖外部上下文
- 命令类应是无状态或仅持有必要快照数据,确保 undo 可靠——比如撤销“扣减库存”需记录扣减前的原始库存值
支持排队与历史记录的调用器
引入 Invoker 类集中管理命令队列和执行流程:
- 用 Deque
存储已执行命令(便于后进先出撤销),用 List 或数据库持久化完整操作日志 - 提供
execute(Command cmd)方法:先调用 cmd.execute(),再将 cmd 推入执行队列,同时写入日志(可异步) - 提供
undo()方法:弹出队列末尾命令,调用其 undo(),并可选地记录撤销动作本身(形成可追溯的操作链)
撤销时的数据一致性保障
撤销不是简单倒放,需结合业务语义设计安全回滚逻辑:
- 避免直接反向操作(如“加库存”可能掩盖并发超卖),建议采用状态快照或补偿事务(Saga)思想
- 关键命令在 execute 前先查询当前状态并缓存(如查出用户余额为100元,扣20元后记下原值),undo 时校验状态未被其他操作覆盖再恢复
- 对不可逆操作(如发信息、调第三方支付回调),undo 应标记为“逻辑撤销”,实际转为通知人工介入或触发补偿流程
实战小示例:简易库存调整命令
以“调整商品库存”为例,体现关键结构:
- InventoryCommand 实现 Command 接口,构造时传入商品ID、目标数量、仓库ID;execute 中查当前库存并更新,同时保存旧值到成员变量
- undo() 先校验当前库存是否仍等于执行后的值(防并发冲突),若一致则恢复旧值并返回 true
- Invoker 执行后将 InventoryCommand 加入 history 列表;撤销时调用 history.removeLast().undo()
作者最新文章
Photoshop文字外框怎么设置?给文字加边框的实用方法
2026-09-22 16:12
白描 PDF
2026-09-16 17:44
密码键盘
2026-09-16 17:43
3dmax快捷键失效了怎么办
2026-09-16 13:53
Xiaomi 18 Fold首销数据解读:较上代大折叠增长310%的原因与配置分析
2026-09-08 16:55
上一篇:
Java 引用类型:对象管理的艺术
热门文章
更多
精品专题
更多
Mac软件
更多
WINDOWS
更多


































