Pattern Composite
Catégorie : Structure
Objectif du pattern
Organiser les objets en structure arborescente afin de représenter une hiérarchie.
Permettre à la partie cliente de manipuler un objet unique et un objet composé de la même manière.
Résultat : Le Design Pattern Composite isole l'appartenance à un agrégat.
Raison d’utilisation
Le système comporte une hiérarchie avec un nombre de niveaux non déterminé.
Il est nécessaire de pouvoir considérer un groupe d’éléments comme un élément unique, par exemple dans un logiciel de DAO où plusieurs éléments graphiques peuvent être regroupés en un nouvel élément graphique.
Chaque élément est un composant potentiel. En plus des éléments classiques, il existe un élément composite qui peut être composé de plusieurs composants.
Comme l’élément composite est un composant potentiel, il peut contenir d’autres éléments composites.
Responsabilités
Composant
Définit l'interface d'un objet pouvant être un composant d'un autre objet de l'arborescence.
Élément
Implémente un objet de l'arborescence n'ayant pas d'autres composants.
Composite
Implémente un objet de l'arborescence pouvant contenir un ou plusieurs autres composants.
La partie client manipule les objets par l'interface Composant.
Implémentation
Classe abstraite Composant
public abstract class Composant {
protected String nom;
protected int level;
public Composant(String nom) {
this.nom = nom;
}
public abstract void operation();
}
Classe Élément
public class Element extends Composant {
public Element(String nom) {
super(nom);
}
@Override
public void operation() {
String tab = "";
for (int i = 0; i < level; i++) {
tab += "--";
}
System.out.println(tab + "Opération sur l'élément (" + nom + ")");
}
}
Classe Composite
import java.util.ArrayList;
import java.util.List;
public class Composite extends Composant {
private List composants = new ArrayList();
public Composite(String nom) {
super(nom);
}
@Override
public void operation() {
String tab = "";
for (int i = 0; i < level; i++) {
tab += "--";
}
System.out.println(tab + "Opération sur un composite(" + nom + ")");
for (Composant composant : composants) {
composant.operation();
}
}
public void add(Composant composant) {
composant.level = this.level + 1;
composants.add(composant);
}
public void remove(Composant composant) {
composants.remove(composant);
}
public List getChilds() {
return composants;
}
}
Exemple d'utilisation
public class Application {
public static void main(String[] args) {
Composite racine = new Composite("Composite 1");
Composite composite2 = new Composite("Composite 2");
racine.add(composite2);
racine.add(new Element("Elément 11"));
racine.add(new Element("Elément 12"));
racine.add(new Element("Elément 13"));
composite2.add(new Element("Elément 21"));
composite2.add(new Element("Elément 22"));
racine.operation();
}
}
Résultat de l'exécution
:Composite
nom="Composite 1" level=0
:Composite
nom="Composite 2" level=1
:Element
nom="Elément 21" level=2
:Element
nom="Elément 22" level=2
:Element
nom="Elément 11" level=1
:Element
nom="Elément 11" level=1
:Element
nom="Elément 12" level=1
:Element
nom="Elément 13" level=1
Opération sur un composite(Composite 1)
-- Opération sur un composite(Composite 2)
---- Opération sur l'élément (Elément 21)
---- Opération sur l'élément (Elément 22)
-- Opération sur l'élément (Elément 11)
-- Opération sur l'élément (Elément 12)
-- Opération sur l'élément (Elément 13)
FAQ
Quelle est la différence entre un Élément et un Composite dans le pattern Composite ?
Un Élément est un objet simple sans sous-composants, tandis qu'un Composite est un objet qui peut contenir d'autres Composants (Élément ou Composite). Ils partagent la même interface, ce qui permet une manipulation uniforme.
Pourquoi utiliser le pattern Composite ?
Il permet de simplifier la gestion des structures hiérarchiques en traitant les objets simples et composés de manière identique, facilitant ainsi l'ajout ou la suppression de composants.
Comment est représentée la hiérarchie dans le pattern Composite ?
La hiérarchie est représentée par une structure arborescente où chaque Composant peut contenir des Composants enfants, créant ainsi une relation parent-enfant.