REBAJA de primavera
Command

Command en Go

Command es un patrón de diseño de comportamiento que convierte solicitudes u operaciones simples en objetos.

La conversión permite la ejecución diferida de comandos, el almacenamiento del historial de comandos, etc.

Ejemplo conceptual

Veamos el patrón Command con el caso de un televisor. Un televisor puede encenderse de dos maneras:

  • Con el botón ON del mando;
  • Con el botón ON del propio televisor.

Podemos comenzar implementando el objeto comando ON con el televisor como receptor. Cuando se invoca el método execute en este comando, éste, por su parte, invoca la función TV.on. La última parte consiste en definir un invocador. Tendremos dos invocadores: el mando y el propio televisor. Ambos integrarán el objeto comando ON.

Observa cómo hemos envuelto la misma solicitud en varios invocadores. Podemos hacer lo mismo con otros comandos. La ventaja de crear un objeto comando separado es que desacoplamos la lógica UI de la lógica de negocio subyacente. No es necesario desarrollar distintos manejadores para cada uno de los invocadores. El objeto comando contiene toda la información que necesita ejecutar. Por lo tanto, también puede utilizarse para una ejecución retardada.

button.go: Invocador

package main

type Button struct {
	command Command
}

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

command.go: Interfaz comando

package main

type Command interface {
	execute()
}

onCommand.go: Comando concreto

package main

type OnCommand struct {
	device Device
}

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

offCommand.go: Comando concreto

package main

type OffCommand struct {
	device Device
}

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

device.go: Interfaz receptora

package main

type Device interface {
	on()
	off()
}

tv.go: Receptor concreto

package main

import "fmt"

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")
}

main.go: Código cliente

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: Resultado de la ejecución

Turning tv on
Turning tv off

Command en otros lenguajes

Command en C# Command en C++ Command en Java Command en PHP Command en Python Command en Ruby Command en Rust Command en Swift Command en TypeScript