El patrón Template Method
Descripción
El patrón Template Method permite delegar en las subclases ciertas etapas de una de las operaciones de un objeto, estando estas etapas descritas en las subclases.
Ejemplo
En el sistema de venta online de vehículos, queremos gestionar pedidos de clientes de España y de Luxemburgo. La diferencia entre ambas peticiones concierne principalmente al cálculo del IVA. Si bien en España la tasa de IVA es del 21%, en el caso de Luxemburgo es del 17%). El cálculo del IVA requiere dos operaciones de cálculo distintas en función del país.
Una primera solución consiste en implementar dos clases distintas sin súperclase común: PedidoEspaña y PedidoLuxemburgo. Esta solución presenta el inconveniente importante de que tiene código idéntico que no ha sido factorizado, como por ejemplo la visualización de la información del pedido (método visualiza).
Podría incluirse una clase abstracta Pedido para factorizar los métodos comunes, como el método visualiza.
El patrón Template Method permite ir más lejos proponiendo factorizar el código común en el interior de los métodos. Tomemos el ejemplo del método calculaImporteConIVA cuyo algoritmo es el siguiente para España (escrito en pseudo-código).
calculaImporteConIVA:
importeIVA = importeSinIVA * 0,21;
importeConIVA = importeSinIVA + importeIVA;
El algoritmo para Luxemburgo tiene el siguiente pseudo-código.
calculaImporteConIVA:
importeIVA = (importeSinIVA * 0,17); ...
Estructura
1. Diagrama de clases
La figura 4-11.4 muestra la estructura genérica del patrón.
Figura 4-11.4 - Estructura del patrón Template Method
2. Participantes
Los participantes del patrón son los siguientes:
-
La clase abstracta ClaseAbstracta (Pedido) incluye el método "modelo" así como la firma de los métodos abstractos que invoca este método.
-
La subclase concreta ClaseConcreta (PedidoEspaña y PedidoLuxemburgo) implementa los métodos abstractos utilizados por el método "modelo" de la clase abstracta. Puede haber varias clases concretas.
3. Colaboraciones
La implementación del algoritmo se realiza mediante la colaboración entre el método "modelo" de la clase abstracta y los métodos de una subclase concreta que complementa el algoritmo.
Dominios de aplicación
El patrón se utiliza en los casos siguientes:
-
Una clase compartida con otra u otras clases con código idéntico que puede factorizarse siempre que las partes específicas a cada clase hayan sido desplazadas a nuevos métodos.
-
Un algoritmo posee una parte invariable y partes específicas a distintos tipos de objetos.
Ejemplo en Java
La clase abstracta Pedido incluye el método "modelo" calculaImporteConIVA que invoca al método abstracto calculaIVA.
public abstract class Pedido
{
protected double importeSinIVA;
protected double importeIVA;
protected double importeConIVA;
protected abstract void calculaIVA();
public void calculaPrecioConIVA()
{
this.calculaIVA();
importeConIVA = importeSinIVA + importeIVA;
}
public void setImporteSinIVA(double importeSinIVA)
{
this.importeSinIVA = importeSinIVA;
}
public void visualiza()
{
System.out.println("Pedido");
System.out.println("Importe sin IVA " + importeSinIVA);
System.out.println("Importe...