¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
  1. Libros
  2. Patrones de diseño en C#
  3. El patrón Template Method
Extrait - Patrones de diseño en C# Los 23 modelos de diseño: descripción y soluciones ilustradas en UML 2 y C# [2ªedición]
Extractos del libro
Patrones de diseño en C# Los 23 modelos de diseño: descripción y soluciones ilustradas en UML 2 y C# [2ªedición] Volver a la página de compra del libro

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 concierte principalmente al cálculo del IVA. En España la tasa de IVA es del 21 %, y, en el caso de Luxemburgo 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 superclase 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 al factorizar 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) 
importeConIVA = importeSinIVA + importeIVA;...

Estructura

1. Diagrama de clases

La figura 4-11.4 muestra la estructura genérica del patrón.

images/fig274.PNG

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 C#

La clase abstracta Pedido incluye el método "modelo" calculaImporteConIVA que invoca al método abstracto calculaIVA.

using System; 
 
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() 
    { 
        Console.WriteLine("Pedido"); 
        Console.WriteLine("Importe sin IVA " + importeSinIVA); 
        Console.WriteLine("Importe con IVA " + importeConIVA); 
    } ...