商城首页欢迎来到中国正版软件门户

您的位置: 首页 > 文章列表 > 编程开发 > 如何使用Java命令模式实现业务请求的排队记录与撤销操作

如何使用Java命令模式实现业务请求的排队记录与撤销操作

  发布于2026-07-01 阅读(0)

扫一扫,手机访问

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

如何使用Ja va命令模式实现业务请求的排队记录与撤销操作

下面从几个关键环节拆解具体实现方式。

命令接口与基础实现

统一的命令接口是整套模式的基石,需要包含执行(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()
本文转载于:https://www.php.cn/faq/2747883.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

产品推荐

热门关注