| name | metaframe-command-pattern |
|---|---|
| category | engineering |
| description | 命令模式 | Code & Engineering |
英文名: Command Pattern
分类: 编码实践
作者: Gamma, Helm, Johnson, Vlissides, 1994
复杂度: intermediate
成熟度: foundational
AI 相关: ✅ 是
将请求封装为对象,从而支持撤销、排队或日志记录等操作
- 命令对象:将操作封装为一等对象,将发送者与接收者及执行时机解耦
- 调用者:触发命令执行,可维护命令历史以支持撤销/重做、重试或审计日志
- 接收者:知道如何执行实际工作的对象;命令委托给它,使自身保持精简
- 定义命令接口:声明所有命令对象必须实现的 execute() 方法(以及可选的 undo())
- 实现具体命令:为每个操作创建一个类,存储接收者引用和执行操作所需的任何参数
- 构建调用者:持有命令引用(或队列),在适当时机调用 execute(),并可选地维护用于撤销的历史栈
- 配置接收者:接收者包含实际的业务逻辑;具体命令委托给它而非自己实现操作
- 组合宏命令:将多个命令组合成复合命令,以原子方式或统一撤销支持执行复杂工作流
['需要可撤销操作——将每个动作与 undo() 方法封装,实现完整的撤销/重做历史', '操作必须作为可序列化对象进行排队、调度或通过网络传输', 'AI 智能体需要规划、验证并选择性地执行或回滚一系列动作']
- 如果需要可逆性,从一开始就与 execute() 一起实现 undo()——事后补加很痛苦
- 保持命令对象不可变且可序列化,以便可靠地记录、传输和重放
- 使用命令队列进行速率限制、重试逻辑和后台处理,将生产与消费解耦
- 不要将业务逻辑放在命令本身——委托给接收者,保持命令作为精简的动作描述符
- 不要为每个简单的方法调用创建命令类;只有在需要排队、撤销或日志记录时开销才是合理的
- 不要忽视 undo() 中的失败处理——将系统置于不一致状态的部分撤销比没有撤销更糟糕
Sources: SDFrame (Software Design) MetaFrame: 💻 Code & Engineering / 编码与工程