命令
把请求封装成可传递的对象。
行为型
说明
队列、撤销和重试需要把“做什么”与“何时执行”分离。
分析
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"}))
}继续阅读
- 设计意图与对象责任
- 设计意图与对象责任
- 设计意图与对象责任