golang设计模式图解——命令模式

发布于:2024-04-09 ⋅ 阅读:(176) ⋅ 点赞:(0)

设计模式

GoF提出的设计模式有23个,包括:
(1)创建型(Creational)模式:如何创建对象;
(2)结构型(Structural )模式:如何实现类或对象的组合;
(3)行为型(Behavioral)模式:类或对象怎样交互以及怎样分配职责。

在这里插入图片描述

行为型模式

命令模式

命令模式,将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。

首先,我们定义命令接口。


// Command 是命令接口
type Command interface {
    Execute()
}

然后,我们实现具体的命令,例如开灯命令和关闭灯命令。

type LightOnCommand struct {
    Light *Light
}

func (loc *LightOnCommand) Execute() {
    loc.Light.On()
}

type LightOffCommand struct {
    Light *Light
}

func (loc *LightOffCommand) Execute() {
    loc.Light.Off()
}

在这里,我们假设Light对象已经实现了On()Off()方法。

接下来,我们实现遥控器,这个遥控器可以设置命令并执行命令。

type SimpleRemoteControl struct {
    slot Command
}

func (src *SimpleRemoteControl) SetCommand(command Command) {
    src.slot = command
}

func (src *SimpleRemoteControl) ButtonWasPressed() {
    src.slot.Execute()
}

最后,我们的客户端代码看起来像这样:

func main() {
    remoteControl := &SimpleRemoteControl{}
    light := &Light{}
    //开灯命令
    lightOnCommand := &LightOnCommand{Light: light}
    //关闭灯命令
    lightOffCommand := &LightOffCommand{Light: light}

    remoteControl.SetCommand(lightOnCommand)
    remoteControl.ButtonWasPressed()

    remoteControl.SetCommand(lightOffCommand)
    remoteControl.ButtonWasPressed()
}

优点: 1、降低了系统耦合度。 2、新的命令可以很容易添加到系统中去。

缺点:使用命令模式可能会导致某些系统有过多的具体命令类。

使用场景:认为是命令的地方都可以使用命令模式,比如: 1、GUI 中每一个按钮都是一条命令。 2、模拟 CMD。

注意事项:系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作,也可以考虑使用命令模式,见命令模式的扩展。
命令模式结构示意图:
在这里插入图片描述
主要涉及到以下几个核心角色:

  • 命令(Command):
    • 定义了执行操作的接口,通常包含一个 execute 方法,用于调用具体的操作。
  • 具体命令(ConcreteCommand):
    • 实现了命令接口,负责执行具体的操作。它通常包含了对接收者的引用,通过调用接收者的方法来完成请求的处理。
  • 接收者(Receiver):
    • 知道如何执行与请求相关的操作,实际执行命令的对象。
  • 调用者/请求者(Invoker):
    • 发送命令的对象,它包含了一个命令对象并能触发命令的执行。调用者并不直接处理请求,而是通过将请求传递给命令对象来实现。
  • 客户端(Client):
    • 创建具体命令对象并设置其接收者,将命令对象交给调用者执行。

总结

命令模式为我们提供了一种将请求或操作封装到一个对象中的方法,它使我们的代码更具有可扩展性和复用性。希望本文能够帮助你理解命令模式,并在实际开发中找到其应用场景。

参考

使用Go语言实现命令模式
菜鸟教程命令模式
《研磨设计模式》读书笔记
Easy 搞定 Golang设计模式


网站公告

今日签到

点亮在社区的每一天
去签到