Implementación del patrón de método de plantilla en Java

1. Información general

En este tutorial rápido, veremos cómo aprovechar el patrón de método de plantilla, uno de los patrones de GoF más populares.

Facilita la implementación de algoritmos complejos al encapsular la lógica en un solo método.

2. Implementación

Para demostrar cómo funciona el patrón del método de plantilla, creemos un ejemplo simple que representa la construcción de una estación de computadora.

Dada la definición del patrón, la estructura del algoritmo se definirá en una clase base que define el método build () de la plantilla :

public abstract class ComputerBuilder { // ... public final Computer buildComputer() { addMotherboard(); setupMotherboard(); addProcessor(); return new Computer(computerParts); } public abstract void addMotherboard(); public abstract void setupMotherboard(); public abstract void addProcessor(); // ... }

La clase ComputerBuilder es responsable de delinear los pasos necesarios para construir una computadora declarando métodos para agregar y configurar diferentes componentes , como una placa base y un procesador.

Aquí, el método build () es el método de plantilla , que define los pasos del algoritmo para ensamblar las partes de la computadora y devuelve instancias de computadora completamente inicializadas .

Tenga en cuenta que se declara como final para evitar que se anule.

3. En acción

Con la clase base ya configurada, intentemos usarla creando dos subclases. Uno que construye una computadora "estándar" y el otro que construye una computadora "de gama alta":

public class StandardComputerBuilder extends ComputerBuilder { @Override public void addMotherboard() { computerParts.put("Motherboard", "Standard Motherboard"); } @Override public void setupMotherboard() { motherboardSetupStatus.add( "Screwing the standard motherboard to the case."); motherboardSetupStatus.add( "Pluging in the power supply connectors."); motherboardSetupStatus.forEach( step -> System.out.println(step)); } @Override public void addProcessor() { computerParts.put("Processor", "Standard Processor"); } }

Y aquí está la variante HighEndComputerBuilder :

public class HighEndComputerBuilder extends ComputerBuilder { @Override public void addMotherboard() { computerParts.put("Motherboard", "High-end Motherboard"); } @Override public void setupMotherboard() { motherboardSetupStatus.add( "Screwing the high-end motherboard to the case."); motherboardSetupStatus.add( "Pluging in the power supply connectors."); motherboardSetupStatus.forEach( step -> System.out.println(step)); } @Override public void addProcessor() { computerParts.put("Processor", "High-end Processor"); } }

Como podemos ver, no tuvimos que preocuparnos por todo el proceso de ensamblaje, sino solo por proporcionar implementaciones para métodos separados.

Ahora veámoslo en acción:

new StandardComputerBuilder() .buildComputer(); .getComputerParts() .forEach((k, v) -> System.out.println("Part : " + k + " Value : " + v)); new HighEndComputerBuilder() .buildComputer(); .getComputerParts() .forEach((k, v) -> System.out.println("Part : " + k + " Value : " + v));

4. Métodos de plantilla en las bibliotecas principales de Java

Este patrón se usa ampliamente en las bibliotecas centrales de Java, por ejemplo, en java.util.AbstractList o java.util.AbstractSet.

Por ejemplo, Abstract List proporciona una implementación esquelética de la interfaz List .

Un ejemplo de un método de plantilla puede ser el método addAll () , aunque no está definido explícitamente como final:

public boolean addAll(int index, Collection c) { rangeCheckForAdd(index); boolean modified = false; for (E e : c) { add(index++, e); modified = true; } return modified; }

Los usuarios solo necesitan implementar el método add () :

public void add(int index, E element) { throw new UnsupportedOperationException(); }

Aquí, es responsabilidad del programador proporcionar una implementación para agregar un elemento a la lista en el índice dado (la parte variante del algoritmo de listado).

5. Conclusión

En este artículo, mostramos el patrón del método de plantilla y cómo implementarlo en Java.

El patrón del método de plantilla promueve la reutilización y el desacoplamiento del código, pero a expensas del uso de la herencia.

Como siempre, todos los ejemplos de código que se muestran en este artículo están disponibles en GitHub.