1. design-patterns/

golang 命令模式讲解和代码示例

·201 字·1 分钟· loading
设计模式 设计模式 golang
demo007x
作者
demo007x
设计模式 - This article is part of a series.
Part : This Article

Go 命令模式讲解和代码示例
#

命令是一种行为设计模式, 它可将请求或简单操作转换为一个对象。

此类转换让你能够延迟进行或远程执行请求, 还可将其放入队列中。

概念示例
#

下面我们通过电视机的例子来了解命令模式。 你可通过以下方式打开电视机:

  • 按下遥控器上的 ON 开关;
  • 按下电视机上的 ON 开关。

我们可以从实现 ON 命令对象并以电视机作为接收者入手。 当在此命令上调用 execute执行方法时, 方法会调用 TV.on打开电视函数。

最后的工作是定义请求者: 这里实际上有两个请求者: 遥控器和电视机。 两者都将嵌入 ON 命令对象。

注意我们是如何将相同请求封装进多个请求者的。 我们也可以采用相同的方式来处理其他命令。 创建独立命令对象的优势在于可将 UI 逻辑与底层业务逻辑解耦。 这样就无需为每个请求者开发不同的处理者了。 命令对象中包含执行所需的全部信息, 所以也可用于延迟执行。

button.go: 请求者
#

package main

type Button struct {
	command Command
}

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

command.go: 命令接口
#

package main

type Command interface {
	execute()
}

onCommand.go: 具体接口
#

package main

type OnCommand struct {
	device Device
}

func (c *OnCommand) execute() {
	c.device.On()
}

offCommand.go: 具体接口
#

package main

type OffCommand struct {
	device Device
}

func (c *OffCommand) execute() {
	c.device.Off()
}

device.go: 接收者接口
#

package main

type Device interface {
	On()
	Off()
}

tv.go: 具体接收者
#

package main

import "fmt"

type TV struct {
	isRunning bool
}

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

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

main.go: 客户端代码
#

package main

func main() {
	tv := &TV{}

	onCommand := &OnCommand{
		device: tv,
	}

	offCommand := &OffCommand{device: tv}

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

	offButton := &Button{
		command: offCommand,
	}

	offButton.press()
}

output.txt: 执行结果
#

Turning tv on
Turning tv off
设计模式 - This article is part of a series.
Part : This Article

Related

golang 责任链模式讲解和代码示例
设计模式 设计模式 golang
责任链是一种行为设计模式, 允许你将请求沿着处理者链进行发送, 直至其中一个处理者对其进行处理。该模式允许多个对象来对请求进行处理, 而无需让发送者类与具体接收者类相耦合。 链可在运行时由遵循标准处理者接口的任意处理者动态生成。
golang 生成器模式讲解和代码示例
设计模式 设计模式 golang
生成器是一种创建型设计模式, 使你能够分步骤创建复杂对象。与其他创建型模式不同, 生成器不要求产品拥有通用接口。 这使得用相同的创建过程生成不同的产品成为可能。
golang 桥接模式模式讲解和代码示例
设计模式 设计模式 golang
桥接是一种结构型设计模式, 可将业务逻辑或一个大类拆分为不同的层次结构, 从而能独立地进行开发