Golang学习条记_41——观察者模式
Golang学习条记_42——迭代器模式
Golang学习条记_43——责任链模式
一、焦点概念
1. 界说
命令模式是一种行为型计划模式,通过将请求封装为独立对象实现调用者与实行者的解耦,支持请求的队列化、撤销重做和事务管理。其焦点特点包括:
• 请求对象化:将操纵抽象为可传递的命令对象
• 解耦调用链:调用者无需相识具体实行细节
• 操纵可编排:支持命令的组合与顺序控制
2. 解决的问题
• 体系紧耦合:消除行为请求者与实现者的直接依靠
• 操纵不可逆:缺乏标准化的撤销/重做机制
• 事务原子性:多步骤操纵无法保证团体实行
3. 焦点角色
角色作用Command界说实行操纵的统一接口(Execute/Undo)ConcreteCommand实现具体命令逻辑,绑定接收者对象Invoker触发命令实行,支持命令存储与调理Receiver实际实行业务操纵的对象Client组装命令对象与接收者的关系 4. 类图
- @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 note
- note right of Receiver
- 实际执行操作的对象
- end note
- @enduml
复制代码 二、特点分析
优点
- 解耦架构:彻底分离请求发起方与实行方
- 可扩展性:新增命令不影响现有体系
- 事务支持:支持多命令原子操纵与回滚
缺点
- 类膨胀:每个命令需独立类实现
- 实行开销:间接调用带来性能损耗
- 复杂度:需处理命令生命周期管理
三、实用场景
1. 事务管理体系
- // 转账命令示例
- type TransferCommand struct {
- from *Account
- to *Account
- amount 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_demo
- import "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 操纵记录编辑器撤销功能 七、实现发起
- 轻量化计划:使用闭包简化简朴命令
- func NewLightCmd(light *Light) Command {
- return CommandFunc(light.Toggle)
- }
复制代码 - 生命周期管理:实现Release()方法释放资源
- 批量操纵:采用组合模式实现命令聚集操纵
- 错误处理:增长Validate()预处理方法
八、典型应用
- 文本编辑器:实现编辑操纵撤销栈
- 智能家居:物联网设备控制中心
- 金融生意业务:多步骤生意业务事务管理
- 游戏开发:玩家操纵回放体系
通过命令模式,可以将分布式体系的操纵请求转化为可序列化对象,实现跨网络的操纵重放与审计。在Go语言中,联合channel特性可构建高性能命令管道,实用于实时生意业务体系等场景。发起对高频操纵命令采用对象池优化,克制重复创建开销。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |