Decorator
Catégorie
Patron structurel
Problème
Ajouter des responsabilités à des objets individuels de manière dynamique et transparente, sans affecter les autres objets. Une alternative à l’héritage pour ajouter des fonctionnalités.
Solution
- Envelopper l’objet original dans une classe decorator qui implémente la même interface
- Le decorator délègue à l’objet enveloppé, en ajoutant un comportement avant ou après la délégation
- Plusieurs decorators peuvent être enchaînés pour ajouter plusieurs comportements
Structure
- Component : Interface pour les objets auxquels des responsabilités peuvent être ajoutées
- ConcreteComponent : L’objet décoré
- Decorator : Classe de base du decorator ; conserve une référence à un Component
- ConcreteDecorator : Ajoute des responsabilités au Component
Avantages clés
- Ajout dynamique de comportement — Ajouter/supprimer des responsabilités au moment de l’exécution
- Principe Ouvert/Fermé — De nouveaux decorators peuvent être ajoutés sans modifier le code existant
- Composabilité — Plusieurs decorators peuvent être empilés pour un comportement combiné
Compromis
- Beaucoup de petits objets — Peut créer une prolifération de classes decorator
- Complexité de configuration — Enchaîner de nombreux decorators peut être difficile à configurer
Quand l’utiliser
- Vous souhaitez ajouter des responsabilités à des objets individuels dynamiquement sans affecter les autres objets
- L’héritage est peu pratique (par exemple, trop de combinaisons possibles de comportement)
- Vous devez pouvoir supprimer des responsabilités