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

server/2025/3/15 5:21:30/

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


文章目录

    • 一、核心概念
      • 1. 定义
      • 2. 解决的问题
      • 3. 核心角色
      • 4. 类图
    • 二、特点分析
    • 三、适用场景
      • 1. 事务管理系统
      • 2. 多媒体遥控器
      • 3. 操作审计系统
    • 四、Go语言实现示例
    • 五、高级应用
      • 1. 宏命令系统
      • 2. 异步命令队列
    • 六、与其他模式对比
    • 七、实现建议
    • 八、典型应用


一、核心概念

1. 定义

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

2. 解决的问题

系统紧耦合:消除行为请求者与实现者的直接依赖
操作不可逆:缺乏标准化的撤销/重做机制
事务原子性:多步骤操作无法保证整体执行

3. 核心角色

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

4. 类图

<a class=命令模式类图" />

@startuml
' 命令模式类图interface Command {+execute(): void
}class Invoker {-command: Command+setCommand(command: Command): void+executeCommand(): void
}class ConcreteCommand {-receiver: Receiver+execute(): void
}class Receiver {+action(): void
}' 关系定义
Command <|.. ConcreteCommand
Invoker o--> Command
ConcreteCommand --> Receiver
Receiver <.. ConcreteCommand : <<create>>note left of Command定义执行操作的接口
end notenote right of Receiver实际执行操作的对象
end note
@enduml

二、特点分析

优点

  1. 解耦架构:彻底分离请求发起方与执行方
  2. 可扩展性:新增命令不影响现有系统
  3. 事务支持:支持多命令原子操作与回滚

缺点

  1. 类膨胀:每个命令需独立类实现
  2. 执行开销:间接调用带来性能损耗
  3. 复杂度:需处理命令生命周期管理

三、适用场景

1. 事务管理系统

// 转账命令示例
type TransferCommand struct {from   *Accountto     *Accountamount int
}func (t *TransferCommand) Execute() {t.from.Debit(t.amount)t.to.Credit(t.amount)
}func (t *TransferCommand) Undo() {t.from.Credit(t.amount)t.to.Debit(t.amount)
}

(实现资金划转与回滚,参考的撤销实现)

2. 多媒体遥控器

type TVPowerCommand struct {tv *Television
}func (c *TVPowerCommand) Execute() {if c.tv.IsOn {c.tv.TurnOff()} else {c.tv.TurnOn()}
}

3. 操作审计系统

type AuditLog struct {commands []Command
}func (a *AuditLog) Record(cmd Command) {a.commands = append(a.commands, cmd)cmd.Execute()
}

四、Go语言实现示例

示例类图

完整实现代码

package command_demoimport "fmt"// Command 接口
type Command interface {Execute()
}// Receiver 实现
type StockTrade struct{}func (s *StockTrade) Buy() {fmt.Println("买入股票")
}func (s *StockTrade) Sell() {fmt.Println("卖出股票")
}// ConcreteCommand 具体命令
type BuyStock struct {stock *StockTrade
}func (b *BuyStock) Execute() {b.stock.Buy()
}type SellStock struct {stock *StockTrade
}func (s *SellStock) Execute() {s.stock.Sell()
}// Invoker 调用者
type Broker struct {orders []Command
}func (b *Broker) TakeOrder(cmd Command) {b.orders = append(b.orders, cmd)
}func (b *Broker) PlaceOrders() {for _, cmd := range b.orders {cmd.Execute()}b.orders = nil
}// 客户端代码
func Example() {stock := &StockTrade{}buy := &BuyStock{stock: stock}sell := &SellStock{stock: stock}broker := &Broker{}broker.TakeOrder(buy)broker.TakeOrder(sell)broker.PlaceOrders()
}

执行结果

=== RUN   TestExample
买入股票
卖出股票
--- PASS: TestExample (0.00s)
PASS

五、高级应用

1. 宏命令系统

type MacroCommand struct {commands []Command
}func (m *MacroCommand) Execute() {for _, cmd := range m.commands {cmd.Execute()}
}// 使用示例
macro := &MacroCommand{commands: []Command{&SaveCommand{},&CompileCommand{},&DeployCommand{},},
}
macro.Execute()

2. 异步命令队列

type AsyncInvoker struct {queue chan Command
}func (a *AsyncInvoker) Start() {go func() {for cmd := range a.queue {cmd.Execute()}}()
}func (a *AsyncInvoker) Add(cmd Command) {a.queue <- cmd
}

六、与其他模式对比

模式核心区别典型应用场景
策略模式算法选择 vs 操作封装支付方式选择
职责链模式请求传递 vs 命令执行审批流程处理
备忘录模式状态存储 vs 操作记录编辑器撤销功能

七、实现建议

  1. 轻量化设计:使用闭包简化简单命令
    func NewLightCmd(light *Light) Command {return CommandFunc(light.Toggle)
    }
    
  2. 生命周期管理:实现Release()方法释放资源
  3. 批量操作:采用组合模式实现命令集合操作
  4. 错误处理:增加Validate()预处理方法

八、典型应用

  1. 文本编辑器:实现编辑操作撤销栈
  2. 智能家居:物联网设备控制中心
  3. 金融交易:多步骤交易事务管理
  4. 游戏开发:玩家操作回放系统

通过命令模式,可以将分布式系统的操作请求转化为可序列化对象,实现跨网络的操作重放与审计。在Go语言中,结合channel特性可构建高性能命令管道,适用于实时交易系统等场景。建议对高频操作命令采用对象池优化,避免重复创建开销。


http://www.ppmy.cn/server/174775.html

相关文章

[Spring]属性加载优先级

Spring中&#xff0c;XML配置文件里面&#xff0c;各个属性源的加载顺序有一定先后顺序。 我们在使用spring时&#xff0c;一些参数配置通常不会直接写在spring的bean的XML配置文件里面。在我们使用${参数名}&#xff0c;时&#xff0c;如果系统环境变量中有同名的name时&#…

Python:函数式编程

函数式编程&#xff08;Functional Programming, FP&#xff09;是一种编程范式&#xff0c;强调通过纯函数、不可变数据和声明式风格来构建程序。Python 虽然不是纯函数式语言&#xff0c;但提供了丰富的函数式编程工具。(简单来说是&#xff0c;函数约等于模块功能&#xff0…

DeepSeek:中国AGI破局者的技术革命与生态重构

在AI领域被"算力霸权"与"技术垄断"笼罩的今天,一家来自杭州的初创公司正以颠覆性创新撕开行业铁幕。DeepSeek(深度求索)不仅重新定义了AGI技术研发范式,更通过开源生态构建引发全球AI产业格局的深度重构。 一、AGI愿景驱动的技术突破 DeepSeek自2023…

AI语言模型 Mythalion 13B 本地搭建与使用指南

一、Mythalion 13B 模型简介 Mythalion 13B 是由 PygmalionAI 与 Gryphe 合作开发的强大语言模型。它通过融合 Pygmalion-2 13B 和 MythoMax L2 13B 模型而成&#xff0c;旨在增强角色扮演&#xff08;RP&#xff09;和聊天场景中的表现。由于其基于 Llama-2 架构构建&#xf…

LLM学习之路-01-第一章-预训练/搞懂大模型的分词器(二)

每天5分钟搞懂大模型的分词器tokenizer&#xff08;二&#xff09;&#xff1a;BPE (Byte-Pair Encoding) BPE (Byte-Pair Encoding) 字节对编码 (BPE) 最初是作为一种压缩文本的算法开发的&#xff0c;最早是由Philip Gage于1994年在《A New Algorithm for Data Compression…

【vllm】Qwen2.5-VL-72B-AWQ 部署记录

版本&#xff1a;0.7.2 注意事项&#xff1a; export LD_LIBRARY_PATH/home/xxxxx/anaconda3/envs/xxxxx/lib/python3.10/site-packages/nvidia/nvjitlink/lib:$LD_LIBRARY_PATH # 如果报错可能需要Also pip install --force-reinstall githttps://github.com/huggingface/tra…

【Deepseek基础篇】--v3基本架构

目录 MOE参数 1.基本架构 1.1. Multi-Head Latent Attention多头潜在注意力 1.2.无辅助损失负载均衡的 DeepSeekMoE 2.多标记预测 2.1. MTP 模块 论文地址&#xff1a;https://arxiv.org/pdf/2412.19437 DeepSeek-V3 是一款采用 Mixture-of-Experts&#xff08;MoE&…

什么是全栈?

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点下班 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 &#x1f4c3;文章前言 &#x1f537;文章均为学习工…