Template Method (patrón de diseño)

De Wikipedia, la enciclopedia libre
Saltar a: navegación, búsqueda

Dentro del marco de la programación orientada a objetos, el patrón Template Method (Método Plantilla o Método Modelo en español) es un patrón de diseño enmarcado dentro de los llamados patrones de comportamiento, que se caracteriza por la definición, dentro de una operación de una superclase, de los pasos de un algoritmo, de forma que todos o parte de estos pasos son redefinidos en las subclases herederas de la citada superclase.

Propósito[editar]

Permitir que ciertos pasos de un algoritmo definido en una operación de una superclase, sean redefinidos en las subclases sin necesidad de tener que sobrescribir la operación entera.

Aplicabilidad[editar]

La utilización del patrón Método Plantilla es adecuada en los siguientes casos:

  • Cuando contamos con un algoritmo con varios pasos que no cambian, de modo que dichos pasos invariantes serían implementados en una superclase, dejando la implementación de los pasos que cambian para las subclases.
  • Para evitar la replicación de código mediante generalización: se factoriza el comportamiento común de varias subclases en una única superclase.
  • Para controlar las extensiones de las subclases. El Método Plantilla utiliza métodos especiales (métodos de enganche o hooks) en ciertos puntos, siendo los únicos puntos que pueden ser redefinidos y, por tanto, los únicos puntos donde es posible la extensión.

Estructura[editar]

Se muestra a continuación la estructura que sigue el patrón Método Plantilla:

Estructura del patrón Template Method

Participantes[editar]

  • Clase Abstracta: proporciona la definición de una serie de operaciones primitivas (normalmente abstractas) que implementan los pasos de un algoritmo y que serán definidas en las subclases.
Se encarga también de la implementación de un método desde el cual son invocadas, entre otras, las operaciones primitivas. Dicho método actúa a modo de plantilla, de ahí el nombre de este patŕon, definiendo la secuencia de operaciones de un algoritmo.
  • Clase Concreta: implementa las operaciones primitivas definidas en la clase abstracta de la cual hereda, quedando así determinado el comportamiento específico del algoritmo definido en el método plantilla, para cada subclase.

Colaboraciones[editar]

Las clases concretas se basan en la clase abstracta para implementar la parte invariante del algoritmo.

Consecuencias[editar]

  • La utilización de este patrón es fundamental a la hora de reutilizar código.
  • Se invierte el control: en este caso la superclase es la encargada de llamar a las operaciones definidas en las subclases.
  • Distinción entre:
  • Operaciones primitivas (implementadas en la superclase)
  • Operaciones de enganche o hooks (proporcionan un código por defecto que puede ser refinado en las subclases).

Cabe destacar que los métodos plantilla juegan un papel clave en las bibliotecas de clases ya que permiten extraer el comportamiento común de las clases de la biblioteca. Otro uso común de este patrón se da en la creación de sistemas de plugins gracias principalmente a la utilización de las anteriormente citadas operaciones de enganche (hooks).

Implementación[editar]

A la hora de proceder a implementar este patrón, resulta de interés tener en cuenta los seguintes detalles:

  • Es recomendable declarar las operaciones primitivas de tal forma que sólo puedan ser llamadas por el método plantilla (protected si se trabaja con el lenguaje de programación Java)
  • Debe reducirse en la medida de lo posible el número de operaciones primitivas que van a ser invocadas desde el método plantilla. De este forma se reducirá la complejidad de las subclases y resultará menos tediosa su implementación.

Ejemplo de implementación (Java)[editar]

Se muestra a continuación un ejemplo de implementación del patrón Método Plantilla. En él se intenta ilustrar a grandes rasgos el modo de desplazamiento de un automóvil que, básicamente, se puede simplificar en: acelerar, cambiar de marcha y frenar. El proceso de acelerar y frenar se puede considerar que es idéntico en todos los automóviles, sin embargo la forma de cambiar de marcha varia de unos a otros según sean autos con cambio manual o autos con cambio automático.

De acuerdo con esto, podemos considerar una superclase Automovil en la cual se define un método plantilla Desplazar desde el cual se llama a la operación primitiva CambiarMarcha que es implementada de una forma en la subclase "AutomovilManual", y de otra forma en la subclase "AutomovilAutomatico".

Ejemplo del patrón Template Method.
public abstract class Automovil
{
    public void desplazar()
    {
        acelerar();
        cambiarMarcha();
        frenar();
    }
 
    private void acelerar()
    {
        System.out.println("Acelerando...");
    }
 
    private void frenar()
    {
        System.out.println("Frenando...");
    }
 
    protected abstract void cambiarMarcha()
}
 
public class AutomovilManual extends AutoMovil
{
    protected void cambiarMarcha()
    {
        System.out.println("Cambiando de marcha de forma manual");
    }
}
 
public class AutomovilAutomatico extends AutoMovil
{
    protected void cambiarMarcha()
    {
        System.out.println("Cambiando de marcha de forma automática");
    }
}

Patrones relacionados[editar]

El patrón Método Plantilla acostumbra relacionarse con los siguientes patrones de diseño:

  • Los métodos plantilla usan la herencia para variar el comportamiento de un algoritmo. En el caso del Patrón Estrategia se usa la delegación y se modifica el algoritmo entero.
  • Los métodos de fabricación suelen ser llamados desde los métodos plantilla.

Véase también[editar]

Bibliografía[editar]

  • E. Gamma, R. Helm, R. Johnson and J. Vlissides (1994). «Design Patterns: elements of reusable object-oriented software». Addison-Wesley.