El Método de Plantilla es un patrón de diseño comportamental. El patrón de diseño del Método de Plantilla se utiliza para crear un esqueleto de método y posponer algunas de las etapas de implementación a las subclases.
Patrón de Diseño del Método de Plantilla
El método de plantilla define los pasos para ejecutar un algoritmo y puede proporcionar una implementación predeterminada que puede ser común para todas o algunas de las subclases. Veamos este patrón con un ejemplo, supongamos que queremos proporcionar un algoritmo para construir una casa. Los pasos que se deben realizar para construir una casa son: construir los cimientos, construir los pilares, construir las paredes y las ventanas. El punto importante es que no podemos cambiar el orden de ejecución porque no podemos construir las ventanas antes de construir los cimientos. Entonces, en este caso, podemos crear un método de plantilla que utilizará diferentes métodos para construir la casa. Ahora, construir los cimientos de una casa es igual para todos los tipos de casas, ya sea una casa de madera o una casa de vidrio. Por lo tanto, podemos proporcionar una implementación base para esto, si las subclases desean anular este método, pueden hacerlo, pero en su mayoría es común para todos los tipos de casas. Para asegurarnos de que las subclases no anulen el método de plantilla, debemos hacerlo final.
Clase Abstracta del Método de Plantilla
Ya que queremos que algunos de los métodos sean implementados por subclases, debemos hacer nuestra clase base como una clase abstracta. HouseTemplate.java
package com.journaldev.design.template;
public abstract class HouseTemplate {
// método de plantilla, final para que las subclases no puedan anularlo
public final void buildHouse(){
buildFoundation();
buildPillars();
buildWalls();
buildWindows();
System.out.println("House is built.");
}
// implementación predeterminada
private void buildWindows() {
System.out.println("Building Glass Windows");
}
// métodos a implementar por las subclases
public abstract void buildWalls();
public abstract void buildPillars();
private void buildFoundation() {
System.out.println("Building foundation with cement,iron rods and sand");
}
}
buildHouse()
es el método de plantilla y define el orden de ejecución para realizar varios pasos.
Clases Concretas del Método de Plantilla
Podemos tener diferentes tipos de casas, como la Casa de Madera y la Casa de Vidrio. WoodenHouse.java
package com.journaldev.design.template;
public class WoodenHouse extends HouseTemplate {
@Override
public void buildWalls() {
System.out.println("Building Wooden Walls");
}
@Override
public void buildPillars() {
System.out.println("Building Pillars with Wood coating");
}
}
Podríamos haber anulado otros métodos también, pero por simplicidad no estoy haciendo eso. GlassHouse.java
package com.journaldev.design.template;
public class GlassHouse extends HouseTemplate {
@Override
public void buildWalls() {
System.out.println("Building Glass Walls");
}
@Override
public void buildPillars() {
System.out.println("Building Pillars with glass coating");
}
}
Cliente del Patrón de Diseño del Método de Plantilla
Probemos nuestro ejemplo de patrón de método de plantilla con un programa de prueba. HousingClient.java
package com.journaldev.design.template;
public class HousingClient {
public static void main(String[] args) {
HouseTemplate houseType = new WoodenHouse();
//usando método de plantilla
houseType.buildHouse();
System.out.println("************");
houseType = new GlassHouse();
houseType.buildHouse();
}
}
Ten en cuenta que el cliente está invocando el método de plantilla de la clase base y, dependiendo de la implementación de los diferentes pasos, está utilizando algunos de los métodos de la clase base y algunos de la subclase. La salida del programa anterior es:
Building foundation with cement,iron rods and sand
Building Pillars with Wood coating
Building Wooden Walls
Building Glass Windows
House is built.
************
Building foundation with cement,iron rods and sand
Building Pillars with glass coating
Building Glass Walls
Building Glass Windows
House is built.
Diagrama de Clase del Método de Plantilla
Patrón de Diseño del Método de Plantilla en JDK
- Todos los métodos no abstractos de java.io.InputStream, java.io.OutputStream, java.io.Reader y java.io.Writer.
- Todos los métodos no abstractos de java.util.AbstractList, java.util.AbstractSet y java.util.AbstractMap.
Puntos Importantes del Patrón de Diseño del Método de Plantilla
- El método de plantilla debe consistir en ciertos pasos cuyo orden está fijo y, para algunos de los métodos, la implementación difiere de la clase base a la subclase. El método de plantilla debe ser final.
- La mayoría de las veces, las subclases llaman a métodos de la superclase, pero en el patrón de plantilla, el método de plantilla de la superclase llama a métodos de las subclases, esto se conoce como el Principio de Hollywood – “no nos llames, te llamaremos a ti”.
- Los métodos en la clase base con implementación predeterminada se denominan Hooks y se pretende que sean anulados por las subclases. Si deseas que algunos de los métodos no sean anulados, puedes hacerlos finales. Por ejemplo, en nuestro caso, podemos hacer que el método buildFoundation() sea final si no queremos que las subclases lo anulen.
Eso es todo para el patrón de diseño del método de plantilla en Java. Espero que te haya gustado.
Source:
https://www.digitalocean.com/community/tutorials/template-method-design-pattern-in-java