Skip to content
← 返回设计模式列表
设计意图与对象责任

命令 ​

把请求封装成可传递的对象。

行为型

说明 ​

队列、撤销和重试需要把“做什么”与“何时执行”分离。

分析 ​

Greet 把要执行的动作及其参数 Name 保存在一个值中,Run 只依赖 Execute 接口。请求因此可以先排队、记录或交给其他组件执行。

命令同时携带动作和参数:Greet 保存 Ada,Run 决定何时调用 Execute;本例立即执行,没有队列或持久化。若把扣款做成命令,重试仍需请求标识和去重;封装成对象不会自动产生幂等。撤销也不是再执行一次命令,而是显式恢复状态或发起补偿。

查看图表代码

适用前提与边界 ​

需要撤销时,命令还要保存反向操作或执行前的状态。 交互流程很短且稳定时,直接调用通常更容易理解。

示例输入与调用 ​

go
fmt.Println(Run(Greet{Name: "Ada"}))

运行输出 ​

text
hello Ada

完整 Go 示例 ​

go
package main

import "fmt"

type Command interface{ Execute() string }
type Greet struct{ Name string }

func (g Greet) Execute() string {
	return "hello " + g.Name
}
func Run(c Command) string {
	return c.Execute()
}

func main() {
	fmt.Println(Run(Greet{Name: "Ada"}))
}

继续阅读