Design Patterns - Composite
Tu apprendras comment représenter une arborescence à l'aide du design pattern Composite
Un arbre généalogique
Tu veux réaliser l'arbre généalogique d'une famille.
Cependant, cet arbre doit tenir des siècles et doit pouvoir être étendu à jamais. Plutôt que d'écrire l'arbre généalogique sur papier, tu décides d'écrire une application qui permet de représenter un arborescence.
Le Composite
Le composite est un design pattern **très fréquemment **utilisé, beaucoup plus que le Singleton. Il est utilisé dans un cas très récurrent: celui où une arborescence doit être représentée. Cela arrive pour des fichiers, des employés, une famille, des comptes bancaires ... Bref, on retrouve une utilisation de ce design pattern partout.
Plusieurs techniques et algorithmes permettent de représenter une arborescence, mais une des plus simples restent l'utilisation de ce pattern.
Et pourquoi le Composition est plus simple que d'autres techniques ? Qu'est-ce qui le rend aussi populaire ?
De manière algorithmique, les hiérarchies et arborescences sont représentés par des arbres binaires. Les arbres binaires sont des structures de données avancées dont les utilisations sont courantes. Cependant un arbre binaire reste assez complexe et il est surtout adapté à des cas de prises de décision. On peut faire plus simples dès lors qu'il s'agit du stockage d'informations ou du traitement uniforme de plusieurs d'objets.
En fait, la magie du Composite est qu'il permet de créer une arborescence de manière très simple ! Une classe a en propriété une liste d'autres objets et chaque objet de la liste peut contenir d'autres objets ect ... Cette conception permet à une arborescence d'exister et cela en utilisant un objet simple et non pas un arbre binaire compliqué.
L'implémentation
L'implémentation de ce design pattern peut-être réalisé de plusieurs manières. Certains développeurs implémentent dans un objet utilisé le pattern composite - cet objet contenant une liste d'autres objets - et permet donc à l'objet de référencer tous ses enfants et de les récupérer à partir de lui. D'autres équipes écrivent une classe à part qui permet de manipuler la liste d'objets d'un autre. Cela dépend des goûts et des cas d'utilisation.
Son implémentation est relativement simple et rudement détaillée sur la Toile.
Challenge
Ton challenge est le suivant: tu vas implémenter un programme représentant un arbre généalogique à partir d'un seul géniteur. Il est donc possible de reconstituer tout l'arbre généalogique en partant du premier géniteur.
Critères de validation
-
L'application contient une classe
Personqui représente le membre d'une famille -
Persona une liste d'autresPersonen propriété. Cette liste contient les descendants directs -
Chaque
Persona une méthodeToString()retournant sous format textuel ses descendants directs -
En appelant la méthode
ToString()d'un seulPersontous les descendants du membre de la famille en question sont renvoyés sous format textuel