命令模式(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."。
Go 语言设计模式
关于 LearnKu
推荐文章: