Padrões de projeto - padrão composto

O padrão composto é usado quando precisamos tratar um grupo de objetos de maneira semelhante a um único objeto. O padrão composto compõe objetos em termos de uma estrutura de árvore para representar parte, bem como toda a hierarquia. Esse tipo de padrão de projeto está incluído no padrão estrutural, pois esse padrão cria uma estrutura em árvore de um grupo de objetos.

Este padrão cria uma classe que contém um grupo de seus próprios objetos. Esta classe fornece maneiras de modificar seu grupo de mesmos objetos.

Estamos demonstrando o uso do padrão composto por meio do exemplo a seguir, no qual mostraremos a hierarquia dos funcionários de uma organização.

Implementação

Temos uma classe Employee que atua como classe de ator de padrão composto. CompositePatternDemo , nossa classe de demonstração usará a classe Employee para adicionar hierarquia de nível de departamento e imprimir todos os funcionários.

Passo 1

Crie a classe Employee com uma lista de objetos 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+" ]");
   }   
}

Passo 2

Use a classe Employee para criar e imprimir a hierarquia de funcionários.

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);
         }
      }		
   }
}

etapa 3

Verifique a saída.

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 ]