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
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.