![Commande](/images/patterns/cards/command-mini.png?id=b149eda017c0583c1e92343b83cfb1eb)
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