Design Pattern : Décorateur
Dans cet article je vais vous présenter un design pattern qui est le décorateur.
Le pattern Décorateur (Decorator) attache dynamiquement de nouvelles fonctionnalité a un objet. Il fournit une alternative souple à l’héritage, pour étendre des fonctionnalités.
Souvent en programmation orienté objet pour ajouter de nouvelles fonctionnalité on utilise l’héritage, pourtant dans certain cas l’héritage purement et simplement n’entraîne qu’une augmentation de la complexité sans avoir de réel intérêt (explosion de classes, diagramme rigide et méthodes de la classe de base inappropriées dans certaines classes dérivées…). Il serait bien plus simple d’ajouter les nouvelles fonctionnalité a l’exécution.
Mise en place du design pattern :
Introduction
Le pattern décorateur est relativement simple : le décorateur est une classe héritant de la classe a décorer et contient une instance de l’objet qu’il décore. Ainsi l’on peut décorer de manière récursive. Prenons par exemple l’image ci-dessus, l’on a deux vaisseaux. L’un est l’objet décoré (le chasseur jedi) tandis que l’autre est le décorateur ( désolé je ne connais pas le nom de cette partie), les deux sont des vaisseaux mais le second rajoute au premier la possibilité d’aller plus vite encore. De manière plus schématique l’on se retrouve dans le cas suivant :
Maintenant voici un petit diagramme uml qui présente un peu plus ce design pattern avant de passer a du code.
On voit bien que notre décorateur hérite du composant a décorer, contient une instance sur un composant.
Implémentation
Maintenant un peu de code simple pour comprendre comment utiliser ce design pattern.
On a donc une classe Ship abstraite, une classe pour les vaisseaux jedi (JediShip) et une classe pour notre accélérateur (Accelerator). Les deux dernières hérite de Ship et peuvent donc etre considéré comme telle (ceci permet d’ajouter des décorateurs de manière récursive). Enfin dans le fichier Warehouse nous avons une utilisation simple de ce design pattern.
Le pattern Décorateur basé sur l’héritage et la composition est facile à mettre place. Il permet de concevoir une application évolutive ou l’ajout et la modification de fonctionnalités ne posera pas de problème. Toutefois l’on instancie beaucoup d’objet (un a chaque new), de ce fait l’utilisation d’une Factory peut être un bon point avec ce design pattern.
Conclusion
- Le décorateur ajoute son comportement a l’objet qu’il décore
- On peut chaîner les décorateurs autant que nécessaire.
- Le décorateur et l’objet qui l’enveloppe ont une classe en commun dans leur arbre d’héritage (ou une interface).
C’est tout pour ce design pattern, en espérant avoir été assez précis. Quel design pattern voudriez vous voir dans un prochain article ?
comments powered by Disqus