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. 類圖
@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. 事務管理系統
// 轉賬命令示例
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 操作記錄 | 編輯器撤銷功能 |
七、實現建議
- 輕量化設計:使用閉包簡化簡單命令
func NewLightCmd(light *Light) Command {return CommandFunc(light.Toggle) }
- 生命周期管理:實現
Release()
方法釋放資源 - 批量操作:采用組合模式實現命令集合操作
- 錯誤處理:增加
Validate()
預處理方法
八、典型應用
- 文本編輯器:實現編輯操作撤銷棧
- 智能家居:物聯網設備控制中心
- 金融交易:多步驟交易事務管理
- 游戲開發:玩家操作回放系統
通過命令模式,可以將分布式系統的操作請求轉化為可序列化對象,實現跨網絡的操作重放與審計。在Go語言中,結合channel特性可構建高性能命令管道,適用于實時交易系統等場景。建議對高頻操作命令采用對象池優化,避免重復創建開銷。