martes, 5 de mayo de 2015

Template Method

Template Method

Propósito

Define en una clase abstracta el esqueleto o los pasos de un algoritmo y cada subclase implementa la estructura concreta de cada uno de los pasos.

Motivación

Supongamos que tenemos una aplicación definida por dos clases, la clase “Application” y la clase “Document”. La clase “Application” se ocupa de abrir documentos almacenados en un formato externo (un fichero). Un objeto de la clase “Document”, representa la información en un documento, una vez que se ha leído del fichero.
La operación OpenDocument() permite abrir y leer un documento.
Se trata de un template method. Define su estructura mediante operaciones abstractas, las cuales serán implementadas por las clases hijas para determinar el comportamiento específico de cada una de ellas.

Aplicabilidad

Se usa para implementar partes invariantes de un algoritmo, y dejar a las subclases implementar el comportamiento que puede variar.
Cuando tenemos un comportamiento común en diferentes clases, puede ser refactorizado para evitar la duplicación de código. Para ello se identifican las partes diferentes del código, se separan mediante nuevas operaciones y se reemplazan con un método que hace uso de ellas.
Para controlar la redefinición de operaciones en las subclases, es posible definir un método Template que llama a una operación “Hook” dentro de la operación que queremos evitar su redefinición, permitiendo únicamente la extensión de la operación “Hook”.
Una subclase puede heredar el comportamiento de una clase padre redefiniendo la operación y llamando a la operación del padre explícitamente.

Estructura

Participantes
  • AbstractClass. Implementa un método plantilla que define el esqueleto de un algoritmo y define métodos abstractos que implementan las subclases concretas.
  • ConcreteClass. Implementa los métodos abstractos para realizar los pasos del algoritmo que son específicos de la subclase.
Colaboraciones

Las clases concretas confían en que la clase abstracta implemente la parte fija del algoritmo

Consecuencias

Ventajas y desventajas:
  • Favorece la reutilización del código. Muy útiles para construir bibliotecas, pues ayuda a factorizar el comportamiento común de las clases.
  • Lleva a una estructura de control invertido (Principio de Hollywood): la superclase base invoca los métodos de las subclases.
Implementación
  • En C++. Las operaciones primitivas pueden definirse como protegidas, permitiendo a las clases hijas su implementación. Tendrán que usarse únicamente dentro del método Template, el cual no debería ser redefinido, por lo que nunca se declarará como virtual. Las operaciones primitivas que obligatoriamente hay que definir, se declaran como virtuales puras.
  • Minimizar las operaciones primitivas. Es importante que el número de operaciones primitivas sea pequeño, cuantas más operaciones haya que definir, mas tedioso será el trabajo que conlleva crear nuevas clases.
  • Convenios de nombres. Se debe poder diferenciar las operaciones que podrían ser redefinidas con las que tienen que ser definidas, por ejemplo añadiendo un prefijo a sus nombres.
Código de ejemplo

public abstract class Automovil
{
    public final 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");
    }
}

Usos conocidos

Se suelen encontrar en casi todas las clases abstractas

Patrones relacionados
  • Strategy. El Strategy usa la composición para cambiar todo el algoritmo, los métodos plantilla usan la herencia para cambiar parte de un algoritmo.
  • Factory Method. Los métodos fábrica suelen llamarse desde métodos plantilla.
Referencias

  • Design Patterns Elements of Reusable Object-Oriented Software, GoF. http://www.lsi.us.es/docencia/get.php?id=1310
  • http://dmi.uib.es/~yuhua/APOO07-08/Presentation/IteratorTemM.pdf
  • http://kybele.escet.urjc.es/docencia/SI/2006-2007/Material/Patrones/22_TemplateMethod.ppt

No hay comentarios:

Publicar un comentario