1.1 Définition et Concept

Le modèle de conception de commande est un modèle de conception comportemental qui permet d'encapsuler une demande en tant qu'objet, de sorte que vous puissiez paramétrer le client avec des demandes différentes.

1.2 But du Modèle de Commande

Le principal but du modèle de commande est de découpler l'émetteur et le récepteur. En encapsulant la demande dans un objet, l'émetteur n'a besoin d'interagir qu'avec l'objet de commande, sans interagir directement avec le récepteur.

2. Caractéristiques et Avantages du Modèle de Commande

Le modèle de commande présente les caractéristiques et avantages suivants :

  • L'encapsulation de la demande dans un objet découple l'émetteur et le récepteur.
  • Il peut mettre en file d'attente des demandes, enregistrer des journaux et effectuer des opérations d'annulation.
  • De nouvelles commandes peuvent être étendues sans modifier le code original.

3. Exemples d'Applications Pratiques du Modèle de Commande

Le modèle de commande est applicable dans les scénarios suivants :

  • Besoin de découpler la demande de l'objet qui exécute la commande.
  • Prise en charge des opérations d'annulation et de répétition.
  • Exécution d'un ensemble d'opérations de manière séquentielle.

4.1 Diagramme de Classe UML

Modèle de Commande Golang

4.2 Introduction de l'Exemple

Dans cet exemple, nous allons créer une implémentation simple du modèle de commande. Supposons que nous ayons une télévision comme récepteur, capable d'effectuer les actions d'allumage et d'extinction. Nous avons également une télécommande en tant qu'invocateur, qui peut définir des commandes spécifiques et les exécuter.

4.3.1 Définir l'Interface de Commande

type ICommand interface {
    Execute()
}

4.3.2 Implémenter la Classe de Commande Concrète

type ConcreteCommand struct {
    receiver IReceiver
}

func (c *ConcreteCommand) Execute() {
    c.receiver.Action()
}

4.3.3 Définir l'Interface du Récepteur

type IReceiver interface {
    Action()
}

4.3.4 Implémenter la Classe de Récepteur Concrète

type Receiver struct {}

func (r *Receiver) Action() {
    fmt.Println("Exécution de l'action")
}

4.3.5 Implémenter le Rôle de l'Invocateur

type Invoker struct {
    command ICommand
}

func (i *Invoker) SetCommand(command ICommand) {
    i.command = command
}

func (i *Invoker) ExecuteCommand() {
    i.command.Execute()
}

4.3.6 Exemple de Code Client

func main() {
    receiver := &Receiver{}
    command := &ConcreteCommand{receiver: receiver}
    invoker := &Invoker{}
    invoker.SetCommand(command)
    invoker.ExecuteCommand()
}

5. Différence Entre le Modèle de Commande et le Modèle de Stratégie

Le modèle de commande et le modèle de stratégie sont similaires dans une certaine mesure, car les deux encapsulent certains comportements dans des objets. La différence réside dans le fait que le modèle de commande est principalement utilisé pour encapsuler les demandes en tant qu'objets et mettre en place des fonctions telles que l'annulation et l'exécution de files d'attente, tandis que le modèle de stratégie est principalement utilisé pour encapsuler une série d'algorithmes et choisir dynamiquement un algorithme à exécuter à l'exécution.

Le modèle de commande convient davantage aux opérations telles que le journalisation et la comptabilité, tandis que le modèle de stratégie convient davantage aux modifications flexibles de la logique métier.