Hourra ! La version française est enfin sortie ! Laissez-nous un message svp, si vous voulez nous faire part de vos commentaires ou signaler une erreur.
Commande

Commande en Go

La Commande est un patron de conception comportemental qui convertit des demandes ou des traitements simples en objets.

Cette conversion permet de différer ou d’exécuter à distance des commandes, de gérer un historique de commandes, etc.

Exemple conceptuel

Regardons un peu la commande dans le contexte d’une télévision. Une TV peut être allumée avec :

  • Le bouton ON de la télécommande,
  • Le bouton ON du téléviseur.

Nous pouvons commencer par l’implémentation de l’objet commande ON en prenant la TV comme récepteur. Lorsque la méthode execute est appelée sur cette commande, elle finira par lancer la fonction TV.on. La dernière partie consiste à définir un demandeur. En réalité, nous allons avoir deux demandeurs : la télécommande et le téléviseur. Ils seront tous deux imbriqués dans l’objet commande ON.

Vous remarquerez que nous avons imbriqué la même requête dans plusieurs demandeurs, comme nous le ferions avec d’autres commandes. Créer un objet commande séparé nous permet de bénéficier du découplage entre la logique de l’UI et celle du métier. Vous n’avez pas besoin de développer différents handlers pour chaque demandeur. L’objet commande contient toutes les informations nécessaires dont il a besoin pour fonctionner. Il peut par conséquent être utilisé pour différer l’exécution.

button.go: Demandeur

package main

type button struct {
	command command
}

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

command.go: Interface commande

package main

type command interface {
	execute()
}

onCommand.go: Commande concrète

package main

type onCommand struct {
	device device
}

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

offCommand.go: Commande concrète

package main

type offCommand struct {
	device device
}

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

device.go: Interface récepteur

package main

type device interface {
	on()
	off()
}

tv.go: Récepteur concret

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: Code client

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: Résultat de l’exécution

Turning tv on
Turning tv off

Commande dans les autres langues

Patrons de conception : Commande en Java Patrons de conception : Commande en C# Patrons de conception : Commande en C++ Patrons de conception : Commande en PHP Patrons de conception : Commande en Python Patrons de conception : Commande en Ruby Patrons de conception : Commande en Swift Patrons de conception : Commande en TypeScript