IT评测·应用市场-qidao123.com
标题:
Golang学习条记_44——命令模式
[打印本页]
作者:
前进之路
时间:
2025-3-13 02:07
标题:
Golang学习条记_44——命令模式
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企服之家,中国第一个企服评测及商务社交产业平台。
欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/)
Powered by Discuz! X3.4