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és 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.
Figure...
Structure
1. Diagramme de classes
La figure 3-4.3 détaille la structure générique du pattern.
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.
Figure 3-4.4 - Traitement d’un message par une feuille
Si le composant est une instance de la classe...
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 C#
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 C# 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é.
using System;
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 bool 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.
using System;
public class SocieteSansFiliale : Societe
{
public override bool ajouteFiliale(Societe filiale)
{
return false;
}
public override double calculeCoutEntretien()
{
return nbrVehicules * coutUnitVehicule;
}
}
Ensuite, la classe SocieteMere s’écrit en C# comme suit. La méthode intéressante est calculeCoutEntretien dont le résultat...