title: Composite (patron de conception)
text: # Composite (patron de conception)
  
  En génie logiciel, un patron composite est un patron de conception (design pattern) structurel. Ce patron permet de concevoir une structure arborescente, par exemple une représentation d'un dossier, ses sous-dossiers et leurs fichiers.
  
  ## Motivation
  
  En programmation orientée objet, le patron composite propose une structure récursive permettant d'implémenter avec la même interface logicielle sur les feuilles et les composites afin qu'ils soient manipulés de la même manière.
  
  ## Structure
  
  * Composant
     * est l'abstraction pour tous les composants, y compris ceux qui sont composés
     * déclare l'interface pour le comportement par défaut
  * Feuille
     * représente un composant n'ayant pas de sous-éléments
     * implémente le comportement par défaut
  * Composite
     * représente un composant pouvant avoir des sous-éléments
     * stocke des composants enfants et permet d'y accéder
     * implémente un comportement en utilisant les enfants
  * Client
     * manipule les objets de la composition à travers l'interface de la classe Composant
  
  ## Exemple C++11
  
  L'exemple qui suit, écrit en C++11, met en œuvre une classe 'Component' qui peut être un fichier (File), un ensemble de fichiers ou un répertoire (Directory). Chaque élément peut être parcouru (méthode virtuelle 'ls_r').
  
  ## Exemple Java
  
  L'exemple qui suit, écrit en Java, met en œuvre une classe graphique qui peut être ou bien une ellipse ou une composition de différents graphiques. Chaque graphique peut être imprimé.
  
  Il pourrait être étendu en y ajoutant d'autres formes (rectangle etc) et méthodes (translation etc).
  
  ## Exemple en PHP 5
  
  Exemple d'utilisation (example of use):
  
  résultat à l'écran (result on the screen) :
  
  ## Exemple C#
  
  Produisant un résultat similaire à l'exemple en php, une variante en C#.
  
  Dans ce code la méthode Display correspond à la méthode opération du diagramme de classes.
  
  Et le résultat (en double):
  
  