Modèles de conception - Motif composite

Le motif composite est utilisé lorsque nous devons traiter un groupe d'objets de la même manière comme un seul objet. Le motif composite compose des objets en termes de structure arborescente pour représenter une partie ainsi que toute la hiérarchie. Ce type de modèle de conception relève d'un modèle structurel car ce modèle crée une structure arborescente de groupe d'objets.

Ce modèle crée une classe qui contient un groupe de ses propres objets. Cette classe fournit des moyens de modifier son groupe de mêmes objets.

Nous démontrons l'utilisation du modèle composite via l'exemple suivant dans lequel nous montrerons la hiérarchie des employés d'une organisation.

la mise en oeuvre

Nous avons une classe Employee qui agit comme une classe d'acteur de modèle composite. CompositePatternDemo , notre classe de démonstration utilisera la classe Employee pour ajouter une hiérarchie au niveau du service et imprimer tous les employés.

Étape 1

Créez une classe Employee avec une liste d' objets Employee .

Employee.java

import java.util.ArrayList;
import java.util.List;

public class Employee {
   private String name;
   private String dept;
   private int salary;
   private List<Employee> subordinates;

   // constructor
   public Employee(String name,String dept, int sal) {
      this.name = name;
      this.dept = dept;
      this.salary = sal;
      subordinates = new ArrayList<Employee>();
   }

   public void add(Employee e) {
      subordinates.add(e);
   }

   public void remove(Employee e) {
      subordinates.remove(e);
   }

   public List<Employee> getSubordinates(){
     return subordinates;
   }

   public String toString(){
      return ("Employee :[ Name : " + name + ", dept : " + dept + ", salary :" + salary+" ]");
   }   
}

Étape 2

Utilisez la classe Employé pour créer et imprimer la hiérarchie des employés.

CompositePatternDemo.java

public class CompositePatternDemo {
   public static void main(String[] args) {
   
      Employee CEO = new Employee("John","CEO", 30000);

      Employee headSales = new Employee("Robert","Head Sales", 20000);

      Employee headMarketing = new Employee("Michel","Head Marketing", 20000);

      Employee clerk1 = new Employee("Laura","Marketing", 10000);
      Employee clerk2 = new Employee("Bob","Marketing", 10000);

      Employee salesExecutive1 = new Employee("Richard","Sales", 10000);
      Employee salesExecutive2 = new Employee("Rob","Sales", 10000);

      CEO.add(headSales);
      CEO.add(headMarketing);

      headSales.add(salesExecutive1);
      headSales.add(salesExecutive2);

      headMarketing.add(clerk1);
      headMarketing.add(clerk2);

      //print all employees of the organization
      System.out.println(CEO); 
      
      for (Employee headEmployee : CEO.getSubordinates()) {
         System.out.println(headEmployee);
         
         for (Employee employee : headEmployee.getSubordinates()) {
            System.out.println(employee);
         }
      }		
   }
}

Étape 3

Vérifiez la sortie.

Employee :[ Name : John, dept : CEO, salary :30000 ]
Employee :[ Name : Robert, dept : Head Sales, salary :20000 ]
Employee :[ Name : Richard, dept : Sales, salary :10000 ]
Employee :[ Name : Rob, dept : Sales, salary :10000 ]
Employee :[ Name : Michel, dept : Head Marketing, salary :20000 ]
Employee :[ Name : Laura, dept : Marketing, salary :10000 ]
Employee :[ Name : Bob, dept : Marketing, salary :10000 ]