Modèle de conception composite en Java

Modèle de conception composite en Java

1. introduction

Dans ce rapide didacticiel, nous présenterons le modèle de conception composite en Java.

Nous allons décrire la structure et le but de son utilisation.

2. La structure

Le motif composite est destiné à permettre de traiter des objets individuels et des compositions d'objets, ou «composites» de la même manière.

Il peut être vu comme une arborescence composée de types héritant d'un type de base et peut représenter une seule partie ou une hiérarchie complète d'objets.

Nous pouvons décomposer le modèle en:

  • composant - est l'interface de base pour tous les objets de la composition. Il doit s'agir d'une interface ou d'une classe abstraite avec les méthodes courantes pour gérer les composites enfants.

  • feuille - implémente le comportement par défaut du composant de base. Il ne contient pas de référence aux autres objets.

  • composite - a des éléments de feuille. Il implémente les méthodes du composant de base et définit les opérations relatives aux enfants.

  • client - a accès aux éléments de la composition à l'aide de l'objet composant de base.

3. Exemple pratique

Passons maintenant à la mise en œuvre. Supposons quewe want to build a hierarchical structure of departments in a company.

3.1. Le composant de base

En tant qu'objet composant, nous définirons une interfaceDepartment simple:

public interface Department {
    void printDepartmentName();
}

3.2. Feuilles

Pour les composants feuille, définissons des classes pour les services financiers et commerciaux:

public class FinancialDepartment implements Department {

    private Integer id;
    private String name;

    public void printDepartmentName() {
        System.out.println(getClass().getSimpleName());
    }

    // standard constructor, getters, setters
}

La deuxième classe feuille,SalesDepartment, est similaire:

public class SalesDepartment implements Department {

    private Integer id;
    private String name;

    public void printDepartmentName() {
        System.out.println(getClass().getSimpleName());
    }

    // standard constructor, getters, setters
}

Les deux classes implémentent la méthodeprintDepartmentName() à partir du composant de base, où elles affichent les noms de classe pour chacune d'elles.

De plus, comme ce sont des classes feuilles, elles ne contiennent pas d’autres objetsDepartment.

Ensuite, voyons également une classe composite.

3.3. L'élément composite

En tant que classe composite, créons une classeHeadDepartment:

public class HeadDepartment implements Department {
    private Integer id;
    private String name;

    private List childDepartments;

    public HeadDepartment(Integer id, String name) {
        this.id = id;
        this.name = name;
        this.childDepartments = new ArrayList<>();
    }

    public void printDepartmentName() {
        childDepartments.forEach(Department::printDepartmentName);
    }

    public void addDepartment(Department department) {
        childDepartments.add(department);
    }

    public void removeDepartment(Department department) {
        childDepartments.remove(department);
    }
}

This is a composite class as it holds a collection of Department components, ainsi que des méthodes pour ajouter et supprimer des éléments de la liste.

La méthode compositeprintDepartmentName() est implémentée en itérant sur la liste des éléments feuille et en invoquant la méthode appropriée pour chacun.

4. Essai

À des fins de test, examinons une classeCompositeDemo:

public class CompositeDemo {
    public static void main(String args[]) {
        Department salesDepartment = new SalesDepartment(
          1, "Sales department");
        Department financialDepartment = new FinancialDepartment(
          2, "Financial department");

        HeadDepartment headDepartment = new HeadDepartment(
          3, "Head department");

        headDepartment.addDepartment(salesDepartment);
        headDepartment.addDepartment(financialDepartment);

        headDepartment.printDepartmentName();
    }
}

Premièrement, nous créons deux instances pour les départements des finances et des ventes. Ensuite, nous instancions le département principal et lui ajoutons les instances créées précédemment.

Enfin, nous pouvons tester la méthode de compositionprintDepartmentName(). Comme on s'y attend,the output contains the class names of each leaf component:

SalesDepartment
FinancialDepartment

5. Conclusion

Dans cet article, nous avons découvert le modèle de conception Composite. La description met en évidence la structure principale et illustre l'utilisation à travers l'exemple pratique.

Comme d'habitude, le code complet est disponible dans lesGithub project.