Паттерны проектирования - составной паттерн
Составной шаблон используется там, где нам нужно одинаково рассматривать группу объектов как единый объект. Составной шаблон объединяет объекты в виде древовидной структуры для представления части, а также всей иерархии. Этот тип шаблона проектирования относится к структурному шаблону, поскольку этот шаблон создает древовидную структуру группы объектов.
Этот шаблон создает класс, содержащий группу собственных объектов. Этот класс предоставляет способы изменения своей группы одинаковых объектов.
Мы демонстрируем использование составного шаблона на следующем примере, в котором мы покажем иерархию сотрудников в организации.
Реализация
У нас есть класс Employee, который действует как класс актора составного шаблона. CompositePatternDemo , наш демонстрационный класс будет использовать класс Employee для добавления иерархии уровня отделов и печати всех сотрудников.
Шаг 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
Проверьте вывод.
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 ]