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