Golang学习条记_44——命令模式

打印 上一主题 下一主题

主题 937|帖子 937|积分 2811

Golang学习条记_41——观察者模式
Golang学习条记_42——迭代器模式
Golang学习条记_43——责任链模式


  

一、焦点概念

1. 界说

命令模式是一种行为型计划模式,通过将请求封装为独立对象实现调用者与实行者的解耦,支持请求的队列化、撤销重做和事务管理。其焦点特点包括:
请求对象化:将操纵抽象为可传递的命令对象
解耦调用链:调用者无需相识具体实行细节
操纵可编排:支持命令的组合与顺序控制
2. 解决的问题

体系紧耦合:消除行为请求者与实现者的直接依靠
操纵不可逆:缺乏标准化的撤销/重做机制
事务原子性:多步骤操纵无法保证团体实行
3. 焦点角色

角色作用Command界说实行操纵的统一接口(Execute/Undo)ConcreteCommand实现具体命令逻辑,绑定接收者对象Invoker触发命令实行,支持命令存储与调理Receiver实际实行业务操纵的对象Client组装命令对象与接收者的关系 4. 类图


  1. @startuml
  2. ' 命令模式类图
  3. interface Command {
  4.     +execute(): void
  5. }
  6. class Invoker {
  7.     -command: Command
  8.     +setCommand(command: Command): void
  9.     +executeCommand(): void
  10. }
  11. class ConcreteCommand {
  12.     -receiver: Receiver
  13.     +execute(): void
  14. }
  15. class Receiver {
  16.     +action(): void
  17. }
  18. ' 关系定义
  19. Command <|.. ConcreteCommand
  20. Invoker o--> Command
  21. ConcreteCommand --> Receiver
  22. Receiver <.. ConcreteCommand : <<create>>
  23. note left of Command
  24.   定义执行操作的接口
  25. end note
  26. note right of Receiver
  27.   实际执行操作的对象
  28. end note
  29. @enduml
复制代码
二、特点分析

优点

  • 解耦架构:彻底分离请求发起方与实行方
  • 可扩展性:新增命令不影响现有体系
  • 事务支持:支持多命令原子操纵与回滚
缺点

  • 类膨胀:每个命令需独立类实现
  • 实行开销:间接调用带来性能损耗
  • 复杂度:需处理命令生命周期管理
三、实用场景

1. 事务管理体系

  1. // 转账命令示例
  2. type TransferCommand struct {
  3.     from   *Account
  4.     to     *Account
  5.     amount int
  6. }
  7. func (t *TransferCommand) Execute() {
  8.     t.from.Debit(t.amount)
  9.     t.to.Credit(t.amount)
  10. }
  11. func (t *TransferCommand) Undo() {
  12.     t.from.Credit(t.amount)
  13.     t.to.Debit(t.amount)
  14. }
复制代码
(实现资金划转与回滚,参考的撤销实现)
2. 多媒体遥控器

  1. type TVPowerCommand struct {
  2.     tv *Television
  3. }
  4. func (c *TVPowerCommand) Execute() {
  5.     if c.tv.IsOn {
  6.         c.tv.TurnOff()
  7.     } else {
  8.         c.tv.TurnOn()
  9.     }
  10. }
复制代码
3. 操纵审计体系

  1. type AuditLog struct {
  2.     commands []Command
  3. }
  4. func (a *AuditLog) Record(cmd Command) {
  5.     a.commands = append(a.commands, cmd)
  6.     cmd.Execute()
  7. }
复制代码
四、Go语言实现示例


完整实现代码
  1. package command_demo
  2. import "fmt"
  3. // Command 接口
  4. type Command interface {
  5.         Execute()
  6. }
  7. // Receiver 实现
  8. type StockTrade struct{}
  9. func (s *StockTrade) Buy() {
  10.         fmt.Println("买入股票")
  11. }
  12. func (s *StockTrade) Sell() {
  13.         fmt.Println("卖出股票")
  14. }
  15. // ConcreteCommand 具体命令
  16. type BuyStock struct {
  17.         stock *StockTrade
  18. }
  19. func (b *BuyStock) Execute() {
  20.         b.stock.Buy()
  21. }
  22. type SellStock struct {
  23.         stock *StockTrade
  24. }
  25. func (s *SellStock) Execute() {
  26.         s.stock.Sell()
  27. }
  28. // Invoker 调用者
  29. type Broker struct {
  30.         orders []Command
  31. }
  32. func (b *Broker) TakeOrder(cmd Command) {
  33.         b.orders = append(b.orders, cmd)
  34. }
  35. func (b *Broker) PlaceOrders() {
  36.         for _, cmd := range b.orders {
  37.                 cmd.Execute()
  38.         }
  39.         b.orders = nil
  40. }
  41. // 客户端代码
  42. func Example() {
  43.         stock := &StockTrade{}
  44.         buy := &BuyStock{stock: stock}
  45.         sell := &SellStock{stock: stock}
  46.         broker := &Broker{}
  47.         broker.TakeOrder(buy)
  48.         broker.TakeOrder(sell)
  49.         broker.PlaceOrders()
  50. }
复制代码
实行结果
  1. === RUN   TestExample
  2. 买入股票
  3. 卖出股票
  4. --- PASS: TestExample (0.00s)
  5. PASS
复制代码
五、高级应用

1. 宏命令体系

  1. type MacroCommand struct {
  2.         commands []Command
  3. }
  4. func (m *MacroCommand) Execute() {
  5.         for _, cmd := range m.commands {
  6.                 cmd.Execute()
  7.         }
  8. }
  9. // 使用示例
  10. macro := &MacroCommand{
  11.         commands: []Command{
  12.                 &SaveCommand{},
  13.                 &CompileCommand{},
  14.                 &DeployCommand{},
  15.         },
  16. }
  17. macro.Execute()
复制代码
2. 异步命令队列

  1. type AsyncInvoker struct {
  2.         queue chan Command
  3. }
  4. func (a *AsyncInvoker) Start() {
  5.         go func() {
  6.                 for cmd := range a.queue {
  7.                         cmd.Execute()
  8.                 }
  9.         }()
  10. }
  11. func (a *AsyncInvoker) Add(cmd Command) {
  12.         a.queue <- cmd
  13. }
复制代码
六、与其他模式对比

模式焦点区别典型应用场景计谋模式算法选择 vs 操纵封装付出方式选择职责链模式请求传递 vs 命令实行审批流程处理备忘录模式状态存储 vs 操纵记录编辑器撤销功能 七、实现发起


  • 轻量化计划:使用闭包简化简朴命令
    1. func NewLightCmd(light *Light) Command {
    2.     return CommandFunc(light.Toggle)
    3. }
    复制代码
  • 生命周期管理:实现Release()方法释放资源
  • 批量操纵:采用组合模式实现命令聚集操纵
  • 错误处理:增长Validate()预处理方法
八、典型应用


  • 文本编辑器:实现编辑操纵撤销栈
  • 智能家居:物联网设备控制中心
  • 金融生意业务:多步骤生意业务事务管理
  • 游戏开发:玩家操纵回放体系
通过命令模式,可以将分布式体系的操纵请求转化为可序列化对象,实现跨网络的操纵重放与审计。在Go语言中,联合channel特性可构建高性能命令管道,实用于实时生意业务体系等场景。发起对高频操纵命令采用对象池优化,克制重复创建开销。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

前进之路

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表