Command

Catégorie

Patron comportemental

Problème

Encapsuler une demande en tant qu’objet, vous permettant ainsi de paramétrer des clients avec différentes demandes, de mettre en file d’attente ou de journaliser les demandes, et de supporter les opérations annulables.

Solution

  • Créer une interface Command avec une méthode execute()
  • Les objets command concrets enveloppent un récepteur et un appel de méthode
  • L’invoker appelle execute() sur la command sans connaître le récepteur

Structure

  • Command : Interface déclarant execute()
  • ConcreteCommand : Définit un lien entre un Receiver et une action
  • Invoker : Demande à la command de s’exécuter
  • Receiver : Sait comment effectuer l’opération
  • Client : Crée le ConcreteCommand et définit son receiver

Avantages clés

  • Découplage de l’invoker et du receiver — L’invoker n’a pas besoin de savoir comment l’action est effectuée
  • Support de l’annulation/rétablissement — Les commands peuvent stocker l’état pour l’inversion
  • File d’attente et journalisation — Les commands peuvent être mises en file d’attente, journalisées ou transmises
  • Commands macro — Plusieurs commands peuvent être combinées en une seule opération

Compromis

  • Peut entraîner beaucoup de classes de commands pour des opérations simples
  • Ajoute une surcharge d’abstraction pour des cas d’utilisation straightforward

Quand l’utiliser

  • Vous souhaitez paramétrer des objets avec une action à effectuer
  • Vous souhaitez spécifier, mettre en file d’attente et exécuter des demandes à des moments différents
  • Vous souhaitez supporter des opérations d’annulation
  • Vous souhaitez supporter la journalisation et les systèmes transactionnels

Exemples