Chain of Responsibility

Catégorie

Patron comportemental

Problème

Éviter de coupler l’expéditeur d’une demande à son récepteur en donnant à plus d’un objet la possibilité de traiter la demande. Chaîner les objets récepteurs et transmettre la demande le long de la chaîne.

Solution

  • Créer une chaîne d’objets handler, chacun capable de traiter la demande
  • Chaque handler décide de traiter la demande ou de la transmettre au handler suivant
  • La chaîne peut être assemblée et modifiée dynamiquement

Structure

  • Handler : Interface définissant une méthode pour traiter les demandes ; conserve une référence au handler suivant
  • ConcreteHandler : Traite les demandes qu’il peut gérer ; transmet les autres au handler suivant
  • Client : Crée la chaîne et envoie une demande au premier handler

Avantages clés

  • Découplage — L’expéditeur et le récepteur sont découplés ; n’importe quel handler de la chaîne peut répondre
  • Principe Ouvert/Fermé — De nouveaux handlers peuvent être ajoutés sans modifier les existants
  • Flexibilité — La chaîne peut être reconfigurée au moment de l’exécution

Compromis

  • Aucune garantie de traitement — Une demande peut atteindre la fin de la chaîne sans être traitée
  • Complexité de débogage — Le chemin de la demande à travers la chaîne peut être difficile à suivre

Quand l’utiliser

  • Plusieurs objets peuvent traiter une demande, et le handler n’est pas connu explicitement
  • Vous souhaitez soumettre une demande à un ensemble d’objets sans spécifier le récepteur
  • L’ensemble des handlers doit être spécifié dynamiquement

Exemples