Voila un exemple simple en C# pour illustrer le pattern composite.
Diagramme UML
Les sources
La classe Forme
abstract class Forme
{
protected string nom;
public Forme(string nom)
{
this.nom = nom;
}
public virtual void Ajouter(Forme f)
{
throw new NotImplementedException();
}
public virtual void Retirer(Forme f)
{
throw new NotImplementedException();
}
public virtual void Afficher(int profondeur)
{
Console.WriteLine(new string('-', profondeur) + nom);
}
public abstract double CalculerAire();
}
{
protected string nom;
public Forme(string nom)
{
this.nom = nom;
}
public virtual void Ajouter(Forme f)
{
throw new NotImplementedException();
}
public virtual void Retirer(Forme f)
{
throw new NotImplementedException();
}
public virtual void Afficher(int profondeur)
{
Console.WriteLine(new string('-', profondeur) + nom);
}
public abstract double CalculerAire();
}
La classe Carre
class Carre : Forme
{
private double cote;
public Carre(string nom, double cote) : base(nom)
{
this.cote = cote;
}
public override double CalculerAire()
{
return cote * cote;
}
}
La classe Cercle
class Cercle : Forme
{
private double rayon;
public Cercle(string nom, double rayon) : base(nom)
{
this.rayon = rayon;
}
public override double CalculerAire()
{
return Math.PI * rayon * rayon;
}
}
La classe Composite
class Composite : Forme
{
private List<Forme> enfants = new List<Forme>();
public Composite(string nom) : base(nom)
{
}
public override void Ajouter(Forme f)
{
enfants.Add(f);
}
public override void Retirer(Forme f)
{
enfants.Remove(f);
}
public override void Afficher(int profondeur)
{
Console.WriteLine(new string('-', profondeur) + "+ " + nom);
foreach (Forme enfant in enfants)
{
enfant.Afficher(profondeur + 2);
}
}
public override double CalculerAire()
{
double aire = 0;
foreach (Forme enfant in enfants)
{
aire += enfant.CalculerAire();
}
return aire;
}
}
Exemple d'utilisation :
static void Main(string[] args)
{
Composite groupe1 = new Composite("Groupe 1");
groupe1.Ajouter(new Cercle("Cercle 1", 3));
groupe1.Ajouter(new Carre("Carre 1", 4));
groupe1.Ajouter(new Carre("Carre 2", 5));
Composite groupe2 = new Composite("Groupe 2");
groupe2.Ajouter(new Cercle("Cercle 2", 2));
groupe2.Ajouter(new Carre("Carre 3", 3));
groupe2.Ajouter(groupe1);
groupe2.Afficher(0);
Console.WriteLine("Aire totale : " + groupe2.CalculerAire());
}