行为设计模式——命令模式

命令(Command)模式是一种行为型模式。它建议将请求封装为一个独立的对象。在这个对象里包含请求相关的全部信息,因此可以将其独立执行。

命令模式试图做到这样的结果:让命令和对应功能解耦,并能根据不同的请求将方法参数化、延迟请求执行或将其放入队列中,且能实现可撤销操作。

用开启和关闭家用电器的例子来举例,示例代码:

package main

import (
	"fmt"
)

// 命令请求者 开关按钮
type Button struct {
	command Commander
}

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

// 命令接口
type Commander interface {
	execute()
}

// 开机命令
type TurnOnCommand struct {
	device Devicer
}

func (c *TurnOnCommand) execute() {
	c.device.TurnOn()
}

// 关机命令
type TurnOffCommand struct {
	device Devicer
}

func (c *TurnOffCommand) execute() {
	c.device.TurnOff()
}

// 命令的接收设备接口
type Devicer interface {
	TurnOn()
	TurnOff()
}

// 电视机
type TV struct{}

func (t *TV) TurnOn() {
	fmt.Println("Turning tv on")
}

func (t *TV) TurnOff() {
	fmt.Println("Turning tv off")
}

// 空调
type AirConditioner struct{}

func (t *AirConditioner) TurnOn() {
	fmt.Println("Turning air conditioner on")
}

func (t *AirConditioner) TurnOff() {
	fmt.Println("Turning air conditioner off")
}

func main() {
	// 初始化电视机的命令
	tv := &TV{}
	tvTurnOnCmd := &TurnOnCommand{
		device: tv,
	}
	tvTurnOffCmd := &TurnOffCommand{
		device: tv,
	}

	// 初始化空调的命令
	ac := &AirConditioner{}
	acTurnOnCmd := &TurnOnCommand{
		device: ac,
	}
	acTurnOffCmd := &TurnOffCommand{
		device: ac,
	}

	// 命令请求按钮
	tvTurnOnBtn := &Button{
		command: tvTurnOnCmd,
	}
	tvTurnOffBtn := &Button{
		command: tvTurnOffCmd,
	}
	acTurnOnBtn := &Button{
		command: acTurnOnCmd,
	}
	acTurnOffBtn := &Button{
		command: acTurnOffCmd,
	}

	// 执行命令
	acTurnOnBtn.press()
	tvTurnOnBtn.press()
	tvTurnOffBtn.press()
	acTurnOffBtn.press()

}

我们分别实现了请求者Button,命令接口Commander,接收者Devicer。请求者Button就像是那个可以执行开启或关闭的遥控器,命令接口Commander则是一个中间层,它使我们的请求者和接收者解耦。

运行示例代码,输出结果:

Turning air conditioner on
Turning tv on
Turning tv off
Turning air conditioner off

关于命令模式也可以阅读Golang-实现设计模式中的命令模式

参考文章:


也可以看看


全国大流量卡免费领

19元月租ㆍ超值优惠ㆍ长期套餐ㆍ免费包邮ㆍ官方正品