Blog ENI : Toute la veille numérique !
🐠 -25€ dès 75€ 
+ 7 jours d'accès à la Bibliothèque Numérique ENI. Cliquez ici
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
  1. Livres et vidéos
  2. Design Patterns en Java
  3. Le pattern Composite
Extrait - Design Patterns en Java Descriptions et solutions illustrées en UML 2 et Java (5e édition) - Les 23 modèles de conception
Extraits du livre
Design Patterns en Java Descriptions et solutions illustrées en UML 2 et Java (5e édition) - Les 23 modèles de conception Revenir à la page d'achat du livre

Le pattern Composite

Description

Le but du pattern Composite est d’offrir un cadre de conception d’une composition d’objets dont la profondeur est variable, cette conception étant basée sur un arbre.

Par ailleurs, cette composition est encapsulée vis-à-vis des clients des objets qui peuvent interagir sans devoir connaître la profondeur de la composition.

Exemple

Au sein de notre système de vente de véhicules, nous voulons représenter les sociétés clientes, notamment pour connaître le nombre de véhicules dont elles disposent et leur proposer des offres de maintenance de leur parc.

Les sociétés qui possèdent des filiales demandent des offres de maintenance qui prennent en compte le parc de véhicules de leurs filiales.

Une solution immédiate consiste à traiter différemment les sociétés sans filiale et celles possédant des filiales. Cependant cette différence de traitement entre les deux types de société rend l’application plus complexe et dépendante de la composition interne des sociétés clientes.

Le pattern Composite résout ce problème en unifiant l’interface des deux types de société et en utilisant la composition récursive. Cette composition récursive est nécessaire car une société peut posséder des filiales qui possèdent elles-mêmes d’autres filiales. Il s’agit d’une composition en arbre (nous faisons l’hypothèse de l’absence de filiale commune entre deux sociétés) comme illustrée à la figure 3-4.1 où les sociétés mères sont placées au-dessus de leurs filiales. ...

Structure

1. Diagramme de classes

La figure 3-4.3 détaille la structure générique du pattern.

images/figure12-3.png

Figure 3-4.3 - Structure du pattern Composite

2. Participants

Les participants au pattern sont les suivants :

  • Composant (Société) est la classe abstraite qui introduit l’interface des objets de la composition, implante les méthodes communes et introduit la signature des méthodes qui gèrent la composition en ajoutant ou en supprimant des composants.

  • Feuille (SociétéSansFiliale) est la classe concrète qui décrit les feuilles de la composition (une feuille ne possède pas de composants).

  • Composé (SociétéMère) est la classe concrète qui décrit les objets composés de la hiérarchie. Cette classe possède une association d’agrégation avec la classe Composant.

  • Client est la classe des objets qui accèdent aux objets de la composition et qui les manipulent.

3. Collaborations

Les clients envoient leurs requêtes aux composants au travers de l’interface de la classe Composant.

Lorsqu’un composant reçoit une requête, il réagit en fonction de sa classe. Si le composant est une feuille, il traite la requête comme illustré à la figure 3-4.4.

images/fig410.PNG

Figure 3-4.4 - Traitement d’un message par une feuille

Si le composant est une instance de la classe Composé, il effectue...

Domaines d’application

Le pattern est utilisé dans les cas suivants :

  • Il est nécessaire de représenter au sein d’un système des hiérarchies de composition.

  • Les clients d’une composition doivent ignorer s’ils communiquent avec des objets composés ou non.

Exemple en Java

Nous reprenons l’exemple des sociétés et de la gestion de leur parc de véhicules.

La classe abstraite Societe est écrite en Java comme suit. Il convient de noter que la méthode ajouteFiliale renvoie un résultat booléen qui indique si l’ajout a pu ou non être réalisé.

public abstract class Societe 
{ 
  protected static double coutUnitVehicule = 5.0; 
  protected int nbrVehicules; 
 
  public void ajouteVehicule() 
  { 
    nbrVehicules = nbrVehicules + 1; 
  } 
 
  public abstract double calculeCoutEntretien(); 
 
  public abstract boolean ajouteFiliale(Societe filiale); 
} 

Le code source de la classe SocieteSansFiliale est fourni à la suite. Les instances de cette classe ne peuvent pas ajouter de filiales.

public class SocieteSansFiliale extends Societe 
{ 
  public boolean ajouteFiliale(Societe filiale) 
  { 
    return false; 
  } 
 
  public double calculeCoutEntretien() 
  { 
    return nbrVehicules * coutUnitVehicule; 
  } 
} 

Ensuite, la classe SocieteMere s’écrit en Java comme suit. La méthode...