Nous commençons notre série des design patterns (patrons de conception) avec le Décorateur.
Pour suivre tous les projets, nous vous avons proposé un github dédié : Découverte des design patterns
Problématique ?
Comment réussir à ajouter des fonctionnalités à un Wookie, sans modifier la classe Wookie ?
Ici, nous souhaitons garder plusieurs grands principes en place :
- SRP : Chaque classe a sa responsabilité : la classe de base garde sa cohésion
- Expert : Chacun est spécialisé dans sa méthode, si on souhaite modifier, on crée une nouvelle classe spécialisée.
Et surtout, nous ne pouvons ou ne souhaitons pas hériter.
Une première solution
C’est ici qu’arrive le décorateur.
Imaginez :
Un wookie arrive durant un combat. Il souhaite avoir la capacité de tirer avec une arme. Cependant, cet arme doit lui permettre aussi de lancer un harpon et d’avoir un pointeur laser ?
Or, on ne peut pas modifier la classe Pistolet pour le Wookie.
Comment faire ?
Mettre en place un décorateur sur le pistolet.
Ici, nous aurons donc :
- Le pistolet normal : class Gun
- Le pistolet avec harpon : class HarpoonGunDecorator
- Le pistolet avec pointeur laser : class LaserGunDecorator
Mis en place, ça donne ça :
Et le résultat :
D’autres patrons possibles
Vous pouvez aussi penser aux patrons suivant :
- Adapter
- Proxy / Strategy