Viva! A versão em Português Brasileiro finalmente foi lançada! Por favor, envie-nos uma mensagem se você quer compartilhar sua opinião ou relatar um erro.
Command

Command em Go

O Command é um padrão de projeto comportamental que converte solicitações ou operações simples em objetos.

A conversão permite a execução adiada ou remota de comandos, armazenamento do histórico de comandos, etc.

Exemplo conceitual

Vejamos o padrão Command com o caso de uma TV. Uma TV pode ser LIGADA por:

  • Botão LIGAR no controle remoto;
  • Botão LIGAR na própria TV.

Podemos começar implementando o objeto de comando LIGAR com a TV como um receptor. Quando o método execute é chamado neste comando, ele, por sua vez, chama a função TV.on. A última parte é definir um invocador. Na verdade, teremos dois invocadores: o controle remoto e a própria TV. Ambos irão incorporar o objeto de comando LIGAR.

Observe como empacotamos a mesma solicitação em vários invocadores. Da mesma forma que podemos fazer com outros comandos. A vantagem de criar um objeto de comando separado é que separamos a lógica da IU da lógica do negócio subjacente. Não há necessidade de desenvolver handlers diferentes para cada um dos invocadores. O objeto de comando contém todas as informações de que precisa para ser executado. Portanto, também pode ser usado para uma execução atrasada.

button.go: Invocador

package main

type button struct {
	command command
}

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

command.go: Interface do command

package main

type command interface {
	execute()
}

onCommand.go: Command concreto

package main

type onCommand struct {
	device device
}

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

offCommand.go: Command concreto

package main

type offCommand struct {
	device device
}

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

device.go: Interface do receptor

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: Resultados da execução

Turning tv on
Turning tv off
Baseado em: Golang By Example

Command em outras linguagens

Padrões de Projeto: Command em Java Padrões de Projeto: Command em C# Padrões de Projeto: Command em C++ Padrões de Projeto: Command em PHP Padrões de Projeto: Command em Python Padrões de Projeto: Command em Ruby Padrões de Projeto: Command em Swift Padrões de Projeto: Command em TypeScript