GO设计模式——16、命令模式(行为型)

目录

命令模式(Command Pattern)

命令模式的核心角色:

优缺点

使用场景

代码实现


命令模式(Command Pattern)

        命令模式(Command  Pattern)将一个请求封装为一个对象(命令本身),使发出请求的责任(命令发送方)和执行请求的责任(命令接收方)分割开。将请求的发送者和接收者解耦,并提供一种灵活的方式来处理请求。命令模式可以用于实现撤销重做队列请求等功能。

命令模式核心角色

  • 命令(Command):定义了执行操作的接口,通常包含一个执行方法。
  • 具体命令(Concrete Command):实现了命令接口,负责执行具体的操作。
  • 调用者(Invoker):负责调用命令对象执行请求。
  • 接收者(Receiver):负责实际执行命令的操作。

优缺点

(1)优点:

  • 符合单一职责原则。在命令模式下,每个命令都是职责单一、松耦合的;当然也可以通过组合的方式,将多个简单的命令组合成一个负责的命令。
  • 可以很方便地实现操作的延迟执行、回滚、重做等。
  • 在分布式架构下,命令模式能够方便地实现异步的数据更新、方法调用等,提升性能。
  • 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

(2)缺点:

  • 命令模式下,调用往往是异步的,而异步会导致系统变得复杂,问题出现时不好定位解决。
  • 随着业务越来越复杂,命令对象也会增多,代码会变得更难维护。

使用场景

  • 事务模式。事务模式下往往需要 Undo 操作,使用命令模式实现起来很方便。
  • 远程执行。Go 标准库下的 exec.Cmdhttp.Client 都属于该类型,将请求封装成命令来执行。
  • CQRS 架构。微服务架构模式中的一种,通过命令模式来实现数据的异步更新。
  • 延迟执行。当你希望一个操作能够延迟执行时,通常会将它封装成命令,然后放到一个队列中。

代码实现

package main

// 远程控制器系统,该系统可以通过遥控器发送不同的命令来控制电视、音响等设备的开关和音量。
// 遥控器上有多个按钮,每个按钮对应一个命令,当用户按下按钮时,命令对象会执行相应的操作。

import "fmt"

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

// 具体命令:打开电视
type TVOnCommand struct {
    tv *TV
}

func NewTVOnCommand(tv *TV) *TVOnCommand {
    return &TVOnCommand{
       tv: tv,
    }
}

func (c *TVOnCommand) Execute() {
    c.tv.On()
}

// 具体命令:关闭电视
type TVOffCommand struct {
    tv *TV
}

func NewTVOffCommand(tv *TV) *TVOffCommand {
    return &TVOffCommand{
       tv: tv,
    }
}

func (c *TVOffCommand) Execute() {
    c.tv.Off()
}

// 接收者:电视
type TV struct {
    isOn bool
}

func (t *TV) On() {
    t.isOn = true
    fmt.Println("TV is on")
}

func (t *TV) Off() {
    t.isOn = false
    fmt.Println("TV is off")
}

// 调用者:遥控器
type RemoteControl struct {
    command Command
}

func (r *RemoteControl) SetCommand(command Command) {
    r.command = command
}

func (r *RemoteControl) PressButton() {
    r.command.Execute()
}

// 客户端代码
func main() {
    tv := &TV{}
    tvOnCommand := NewTVOnCommand(tv)
    tvOffCommand := NewTVOffCommand(tv)

    remoteControl := &RemoteControl{}
    remoteControl.SetCommand(tvOnCommand)
    remoteControl.PressButton()

    remoteControl.SetCommand(tvOffCommand)
    remoteControl.PressButton()
}

相关推荐

  1. GO设计模式——16命令模式行为

    2023-12-23 06:00:02       43 阅读
  2. 笨蛋学设计模式行为模式-命令模式19

    2023-12-23 06:00:02       30 阅读
  3. GO设计模式——15、责任链模式行为

    2023-12-23 06:00:02       34 阅读
  4. GO设计模式——18、迭代器模式行为

    2023-12-23 06:00:02       45 阅读
  5. GO设计模式——19、中介者模式行为

    2023-12-23 06:00:02       45 阅读
  6. GO设计模式——17、解释器模式行为

    2023-12-23 06:00:02       44 阅读
  7. 行为设计模式命令模式

    2023-12-23 06:00:02       32 阅读
  8. GO设计模式——25、模板模式行为

    2023-12-23 06:00:02       36 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-23 06:00:02       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-23 06:00:02       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-23 06:00:02       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-23 06:00:02       18 阅读

热门阅读

  1. DotNet Core 在Centos上使用环境变量运行 urls 参数

    2023-12-23 06:00:02       40 阅读
  2. react useMemo的使用

    2023-12-23 06:00:02       32 阅读
  3. FFmpeg 版本gyan.dev和BtbN区别

    2023-12-23 06:00:02       41 阅读
  4. 压力测试(超详细总结)

    2023-12-23 06:00:02       41 阅读
  5. react v-18父组件调用子组件的方法和数据

    2023-12-23 06:00:02       44 阅读
  6. Quartz.net 正则表达式触发器

    2023-12-23 06:00:02       46 阅读
  7. 状态码403什么时候会遇到?怎么解决?

    2023-12-23 06:00:02       42 阅读
  8. 分糖果(周赛)

    2023-12-23 06:00:02       46 阅读
  9. 如何在Node.js中使用Redis实现一个游戏排行榜?

    2023-12-23 06:00:02       40 阅读