À retenir
- Découple l'émetteur de la requête de ses récepteurs.
- Chaque maillon décide de traiter la requête ou de la passer au suivant.
- Permet d'ajouter dynamiquement des étapes de traitement.
La chaîne de responsabilité est une organisation du code qui permet de faire passer une demande (comme une commande ou une alerte) à travers une suite d'intervenants. Imaginez un service client téléphonique : si le premier niveau ne peut pas répondre, il passe l'appel au technicien, qui peut lui-même le passer à un ingénieur si besoin, jusqu'à ce que quelqu'un traite le problème.
Étymologie
Traduction littérale de l'anglais Chain of Responsibility. Ce concept a été formalisé pour la première fois en 1994 dans l'ouvrage de référence sur les patrons de conception (Design Patterns) écrit par le groupe d'auteurs surnommé le "Gang of Four" (GoF).
Exemples d'usage
- Les middlewares dans un serveur web (Express, ASP.NET) : chaque couche vérifie si l'utilisateur est connecté, puis s'il a les droits, avant de lui donner accès aux données.
- La gestion des clics dans une interface graphique : si un bouton ne gère pas le clic, il est transmis à la fenêtre parente, puis à l'application globale.
- Un système de filtrage de courriels qui passe un message successivement à un filtre anti-spam, un filtre antivirus, puis un filtre de priorité.
Cas d'usage
On utilise ce modèle quand on veut que plusieurs objets puissent répondre à une requête sans que l'émetteur ait besoin de savoir quel objet s'en chargera précisément. C'est idéal pour créer des systèmes modulaires où l'on peut ajouter ou retirer des étapes de traitement sans casser le reste du programme.
Bonnes pratiques
Il est crucial de toujours prévoir un gestionnaire par défaut en fin de chaîne pour éviter qu'une requête ne se perde dans le vide si personne ne sait la traiter. Attention également à ne pas créer des chaînes trop longues qui pourraient ralentir l'application ou rendre le débogage complexe.
Synonymes
Antonymes
Conseil
Pour bien débuter, visualisez ce patron comme une liste chaînée d'objets où chaque objet possède une méthode handle() et une référence vers son suivant. Commencez par l'utiliser pour simplifier des blocs switch ou if/else trop complexes qui gèrent des conditions multiples.
Questions fréquentes
Est-ce que tous les maillons doivent traiter la requête ?
Non, le principe est souvent qu'un seul maillon traite la requête et arrête la propagation, mais il existe des variantes où chaque maillon ajoute sa contribution.
Quelle est la différence avec un simple 'if/else' ?
Le 'if/else' est rigide et centralisé. La chaîne de responsabilité permet de modifier l'ordre ou le nombre d'étapes sans toucher au code principal.
Que se passe-t-il si la chaîne est cassée ?
Si un maillon oublie de passer la main au suivant, la requête s'arrête brusquement. C'est un point de vigilance majeur en développement.