命令模式(Command Pattern)
命令模式是一种行为型设计模式,它将请求封装为一个对象,从而使不同的请求可以对客户端进行参数化,同时使请求的来源和目标解耦。
在 Go 语言中,可以使用接口和结构体来实现命令模式。
首先,定义一个命令接口:
type Command interface {
Execute()
}
接口中只有一个方法 Execute()
,该方法用于执行命令。接着,定义一个命令结构体:
type ConcreteCommand struct {
receiver Receiver
}
func (c *ConcreteCommand) Execute() {
c.receiver.Action()
}
结构体中包含一个接收者( Receiver
)对象,并实现了 Execute()
方法。在 Execute()
方法中,执行接收者对象的 Action()
方法。
接着,定义一个接收者结构体:
type Receiver struct{}
func (r *Receiver) Action() {
fmt.Println("Receiver.Action executed.")
}
接收者结构体中只有一个方法 Action()
,用于执行接收者对象的具体操作。
最后,定义一个请求者(Invoker
)结构体:
type Invoker struct {
command Command
}
func (i *Invoker) SetCommand(c Command) {
i.command = c
}
func (i *Invoker) ExecuteCommand() {
i.command.Execute()
}
请求者结构体包含一个命令对象,并提供 SetCommand()
方法用于设置命令对象,以及 ExecuteCommand()
方法用于执行命令对象。
下面是一个完整的示例代码,其中包括了命令接口、命令结构体、接收者结构体和请求者结构体的实现:
package main
import "fmt"
// Command 接口
type Command interface {
Execute()
}
// ConcreteCommand 结构体
type ConcreteCommand struct {
receiver Receiver
}
func (c *ConcreteCommand) Execute() {
c.receiver.Action()
}
// Receiver 结构体
type Receiver struct{}
func (r *Receiver) Action() {
fmt.Println("Receiver.Action executed.")
}
// Invoker 结构体
type Invoker struct {
command Command
}
func (i *Invoker) SetCommand(c Command) {
i.command = c
}
func (i *Invoker) ExecuteCommand() {
i.command.Execute()
}
func main() {
receiver := &Receiver{}
command := &ConcreteCommand{*receiver}
invoker := &Invoker{}
invoker.SetCommand(command)
invoker.ExecuteCommand()
}
在这个示例代码中,首先创建了一个接收者对象 receiver
,然后创建了一个命令对象 command
,并将接收者对象 receiver
传递给命令对象 command
的构造函数。接着创建了一个请求者对象 invoker
,并将命令对象 command
设置为请求者对象 invoker
的命令对象。最后,执行请求者对象 invoker
的 ExecuteCommand()
方法,该方法会执行命令对象 command
的 Execute()
方法,从而执行接收者对象 receiver
的 Action()
方法,输出 "Receiver.Action executed."
。
推荐文章: