Go语言实现命令模式(Command Pattern)
在软件工程中,设计模式是解决常见软件设计问题的最佳实践。命令模式(Command Pattern)是一种行为设计模式,它将一个请求封装为一个对象,从而使你可用不同的请求、队列、日志来参数化其他对象。命令模式也支持可撤销的操作。
命令模式简介
命令模式主要涉及以下几个角色:
- 命令(Command):声明了一个接口,用于执行操作。
- 具体命令(Concrete Command):实现了命令接口,将接收者绑定于一个动作上。
- 调用者(Invoker):要求命令执行这个请求。
- 接收者(Receiver):知道如何执行与请求相关的操作。
- 客户端(Client):创建具体命令对象并设置命令的接收者。
Go语言实现
下面是一个简单的Go语言实现示例,展示了命令模式的基本用法。我们将构建一个模拟远程控制的系统,可以控制电视(TV)的打开和关闭。
定义命令接口
package main
import "fmt"
// Command 接口
type Command interface {
Execute()
}
具体命令实现
// TurnOnCommand 具体命令,实现打开电视
type TurnOnCommand struct {
tv TV
}
func (c *TurnOnCommand) Execute() {
c.tv.On()
}
// TurnOffCommand 具体命令,实现关闭电视
type TurnOffCommand struct {
tv TV
}
func (c *TurnOffCommand) Execute() {
c.tv.Off()
}
接收者(电视)
// TV 电视接口
type TV interface {
On()
Off()
}
// ConcreteTV 电视的具体实现
type ConcreteTV struct{}
func (tv *ConcreteTV) On() {
fmt.Println("电视已打开")
}
func (tv *ConcreteTV) Off() {
fmt.Println("电视已关闭")
}
调用者(遥控器)
// RemoteControl 遥控器,调用者
type RemoteControl struct {
command Command
}
func (rc *RemoteControl) SetCommand(cmd Command) {
rc.command = cmd
}
func (rc *RemoteControl) PressButton() {
if rc.command != nil {
rc.command.Execute()
}
}
客户端代码
func main() {
tv := &ConcreteTV{}
onCommand := &TurnOnCommand{tv: tv}
offCommand := &TurnOffCommand{tv: tv}
remote := &RemoteControl{}
remote.SetCommand(onCommand)
remote.PressButton() // 输出:电视已打开
remote.SetCommand(offCommand)
remote.PressButton() // 输出:电视已关闭
}
总结
在这个例子中,我们通过Go语言实现了命令模式。通过定义命令接口、具体命令、接收者(电视)和调用者(遥控器),我们成功地将请求和执行解耦,使得命令的发送者和接收者之间完全独立,增加了系统的灵活性和可扩展性。命令模式非常适合用于需要支持命令的撤销、记录命令历史、将命令排队等场景。以上就是命令模式的用法。欢迎关注公众号"彼岸流天"。