Композитен модел на дизайн в Java

1. Въведение

В този бърз урок ще представим съставния модел на проектиране в Java.

Ще опишем структурата и целта на нейното използване.

2. Структурата

Композитният модел има за цел да позволи третирането на отделни обекти и композиции от предмети или „композити“ по същия начин.

Тя може да се разглежда като дървовидна структура, съставена от типове, които наследяват основен тип, и може да представлява една част или цяла йерархия от обекти.

Можем да разделим модела на:

  • компонент - е основният интерфейс за всички обекти в композицията. Това трябва да бъде или интерфейс, или абстрактен клас с общите методи за управление на детските композити.
  • leaf - реализира поведението по подразбиране на основния компонент. Не съдържа препратка към другите обекти.
  • композитен - има листни елементи. Той реализира методите на базовия компонент и дефинира свързаните с детето операции.
  • клиент - има достъп до елементите на композицията, като използва обекта на базовия компонент.

3. Практически пример

Сега, нека да се потопим в изпълнението. Да предположим, че искаме да изградим йерархична структура на отделите в една компания.

3.1. Основният компонент

Като обект на компонент ще определим прост интерфейс на отдел :

public interface Department { void printDepartmentName(); }

3.2. листа

За компонентите на листа, нека дефинираме класове за финансови и търговски отдели:

public class FinancialDepartment implements Department { private Integer id; private String name; public void printDepartmentName() { System.out.println(getClass().getSimpleName()); } // standard constructor, getters, setters }

Вторият лист клас, SalesDepartment, е подобен:

public class SalesDepartment implements Department { private Integer id; private String name; public void printDepartmentName() { System.out.println(getClass().getSimpleName()); } // standard constructor, getters, setters }

И двата класа изпълняват метода printDepartmentName () от базовия компонент, където отпечатват имената на класовете за всеки от тях.

Освен това, тъй като те са класове на листа, те не съдържат други обекти на отдел .

След това нека видим и композитен клас.

3.3. Композитният елемент

Като композитен клас, нека създадем клас HeadDepartment :

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

Това е композитен клас, тъй като съдържа колекция от компоненти на отдел , както и методи за добавяне и премахване на елементи от списъка.

Методът composite printDepartmentName () е реализиран чрез итерация върху списъка с листни елементи и извикване на подходящия метод за всеки един.

4. Тестване

За целите на теста, нека да разгледаме клас CompositeDemo :

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

Първо, ние създаваме две инстанции за финансовия отдел и отделите по продажби. След това създаваме екземпляр на главния отдел и добавяме предварително създадените екземпляри към него.

И накрая, можем да тестваме метода на композиция printDepartmentName () . Както очакваме, изходът съдържа имената на класовете на всеки компонент на листа :

SalesDepartment FinancialDepartment

5. Заключение

В тази статия научихме за модела на композитния дизайн. Записът подчертава основната структура и демонстрира използването чрез практическия пример.

Както обикновено, пълният код е достъпен в проекта Github.