¡Hurra! ¡La versión en español se lanzó por fin! Por favor, envíanos un mensaje si quieres compartir tu opinión o reportar un error.
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

Patrones de diseño: Command en Java Patrones de diseño: Command en C# Patrones de diseño: Command en C++ Patrones de diseño: Command en PHP Patrones de diseño: Command en Python Patrones de diseño: Command en Ruby Patrones de diseño: Command en Swift Patrones de diseño: Command en TypeScript