Patrón de diseño compuesto en Java

1. Introducción

En este tutorial rápido, presentaremos el patrón de diseño compuesto en Java.

Vamos a describir la estructura y el propósito de su uso.

2. La estructura

El patrón compuesto está destinado a permitir tratar objetos individuales y composiciones de objetos, o "compuestos" de la misma manera.

Puede verse como una estructura de árbol compuesta por tipos que heredan un tipo base y puede representar una sola parte o una jerarquía completa de objetos.

Podemos dividir el patrón en:

  • componente: es la interfaz base para todos los objetos de la composición. Debe ser una interfaz o una clase abstracta con los métodos comunes para administrar los compuestos secundarios.
  • hoja: implementa el comportamiento predeterminado del componente base. No contiene una referencia a los otros objetos.
  • compuesto - tiene elementos de hoja. Implementa los métodos del componente base y define las operaciones relacionadas con el niño.
  • cliente: tiene acceso a los elementos de composición utilizando el objeto del componente base.

3. Ejemplo práctico

Ahora, profundicemos en la implementación. Supongamos que queremos construir una estructura jerárquica de departamentos en una empresa.

3.1. El componente base

Como objeto componente, definiremos una interfaz de departamento simple :

public interface Department { void printDepartmentName(); }

3.2. Hojas

Para los componentes hoja, definamos clases para departamentos financieros y de ventas:

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

La segunda clase de hoja, SalesDepartment, es similar:

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

Ambas clases implementan el método printDepartmentName () desde el componente base, donde imprimen los nombres de clase para cada una de ellas.

Además, como son clases hoja, no contienen otros objetos de Departamento .

A continuación, veamos también una clase compuesta.

3.3. El elemento compuesto

Como clase compuesta, creemos una clase 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); } }

Esta es una clase compuesta, ya que contiene una colección de componentes de Departamento , así como métodos para agregar y eliminar elementos de la lista.

El método compuesto printDepartmentName () se implementa iterando sobre la lista de elementos hoja e invocando el método apropiado para cada uno.

4. Prueba

Para propósitos de prueba, echemos un vistazo a una clase 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(); } }

Primero, creamos dos instancias para los departamentos financiero y comercial. Después, creamos una instancia del departamento principal y le agregamos las instancias creadas previamente.

Finalmente, podemos probar el método de composición printDepartmentName () . Como esperamos, la salida contiene los nombres de clase de cada componente hoja :

SalesDepartment FinancialDepartment

5. Conclusión

En este artículo, aprendimos sobre el patrón de diseño compuesto. El artículo destaca la estructura principal y demuestra el uso a través del ejemplo práctico.

Como es habitual, el código completo está disponible en el proyecto Github.