行为型:三. 命令模式

命令模式是什么

命令模式是一种行为型设计模式,它可以将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通,这样方便将命令对象进行储存、传递、调用、增加与管理。

为什么用命令模式

在软件开发系统中,“方法的请求者”与“方法的实现者”之间经常存在紧密的耦合关系,这不利于软件功能的扩展与维护。例如,想对方法进行“撤销、重做、记录”等处理都很不方便,因此“如何将方法的请求者与实现者解耦?”变得很重要,命令模式就能很好地解决这个问题。

在现实生活中,命令模式的例子也很多。比如看电视时,我们只需要轻轻一按遥控器就能完成频道的切换,这就是命令模式,将换台请求和换台处理完全解耦了。电视机遥控器(命令发送者)通过按钮(具体命令)来遥控电视机(命令接收者)。

命令模式怎么实现

这里以生活中电视机遥控器(命令发送者)通过按钮(具体命令)来遥控电视机(命令接收者)来举例。

device.go (电视设备)

package command

import "fmt"

type device interface {
    on()
    off()
}

type tv struct {
    isRunning bool
}

func (t *tv) on() {
    t.isRunning = true
    fmt.Println("Turning tv on")
}

func (t *tv) off() {
    t.isRunning = false
    fmt.Println("Turning tv off")
}

command.go 命令

package command

type command interface {
    execute()
}

type onCommand struct {
    device device
}

func (c *onCommand) execute() {
    c.device.on()
}


type offCommand struct {
    device device
}

func (c *offCommand) execute() {
    c.device.off()
}

button.go 按钮

package command

type button struct {
    command command
}

func (b *button) press() {
    b.command.execute()
}

example.go 客户端调用示例

package command

func Example() {
    tv := &tv{}

    onCommand := &onCommand{
        device: tv,
    }

    offCommand := &offCommand{
        device: tv,
    }

    onButton := &button{
        command: onCommand,
    }
    onButton.press()

    offButton := &button{
        command: offCommand,
    }
    offButton.press()
}

优点

  1. 单一职责原则。 你可以解耦触发和执行操作的类。
  2. 开闭原则。 扩展性良好,增加或删除命令非常方便。采用命令模式增加与删除命令不会影响其他类。

缺点

  1. 可能产生大量具体的命令类。因为每一个具体操作都需要设计一个具体命令类,这会增加系统的复杂性。
posted @ 2022-04-13 22:21  EthanWell  阅读(98)  评论(0编辑  收藏  举报