go进阶编程:设计模式之命令模式

48 阅读2分钟

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语言实现了命令模式。通过定义命令接口、具体命令、接收者(电视)和调用者(遥控器),我们成功地将请求和执行解耦,使得命令的发送者和接收者之间完全独立,增加了系统的灵活性和可扩展性。命令模式非常适合用于需要支持命令的撤销、记录命令历史、将命令排队等场景。以上就是命令模式的用法。欢迎关注公众号"彼岸流天"。