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

Exemples