Учебники

Шаблоны дизайна — Композитный шаблон

Составной шаблон используется там, где нам нужно обрабатывать группу объектов аналогичным образом, как один объект. Составной шаблон объединяет объекты в виде древовидной структуры для представления части, а также всей иерархии. Этот тип шаблона проектирования подпадает под структурный шаблон, поскольку этот шаблон создает древовидную структуру группы объектов.

Этот шаблон создает класс, который содержит группу своих объектов. Этот класс предоставляет способы изменить свою группу одинаковых объектов.

Мы демонстрируем использование составного шаблона на следующем примере, в котором мы покажем иерархию сотрудников организации.

Реализация

У нас есть класс Employee, который действует как класс актера составного паттерна. CompositePatternDemo , наш демонстрационный класс будет использовать класс Employee для добавления иерархии уровня отдела и печати всех сотрудников.

Диаграмма UML составного образца

Шаг 1

Создайте класс Employee, имеющий список объектов 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+" ]");
   }   
}

Шаг 2

Используйте класс Employee для создания и печати иерархии сотрудников.

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

Шаг 3

Проверьте вывод.