Introducción

El patrón Template Method es un patrón de diseño de comportamiento que define el esqueleto de un algoritmo en una operación, diferiendo algunos pasos a las subclases. Permite que las subclases redefinan ciertos pasos de un algoritmo sin cambiar la estructura del mismo.

Conceptos Clave

  • Algoritmo: Una secuencia de pasos para realizar una tarea.
  • Método Template: Un método que define el esqueleto de un algoritmo.
  • Métodos Abstractos: Métodos que deben ser implementados por las subclases.
  • Métodos Hook: Métodos opcionales que pueden ser sobrescritos por las subclases.

Estructura

El patrón Template Method generalmente incluye:

  1. Clase Abstracta: Define el método template y los métodos abstractos.
  2. Subclases Concretas: Implementan los métodos abstractos definidos en la clase abstracta.

Diagrama UML

+-------------------+
| AbstractClass     |
+-------------------+
| +templateMethod() |
| +primitiveOp1()   |
| +primitiveOp2()   |
+-------------------+
        ^
        |
+-------------------+
| ConcreteClass     |
+-------------------+
| +primitiveOp1()   |
| +primitiveOp2()   |
+-------------------+

Ejemplo Práctico

Vamos a implementar un ejemplo en Python donde tenemos una clase abstracta CaffeineBeverage que define el método template prepareRecipe. Las subclases Tea y Coffee implementan los pasos específicos del algoritmo.

Código

from abc import ABC, abstractmethod

class CaffeineBeverage(ABC):
    def prepareRecipe(self):
        self.boilWater()
        self.brew()
        self.pourInCup()
        self.addCondiments()

    def boilWater(self):
        print("Boiling water")

    def pourInCup(self):
        print("Pouring into cup")

    @abstractmethod
    def brew(self):
        pass

    @abstractmethod
    def addCondiments(self):
        pass

class Tea(CaffeineBeverage):
    def brew(self):
        print("Steeping the tea")

    def addCondiments(self):
        print("Adding lemon")

class Coffee(CaffeineBeverage):
    def brew(self):
        print("Dripping coffee through filter")

    def addCondiments(self):
        print("Adding sugar and milk")

# Uso del patrón Template Method
def main():
    tea = Tea()
    coffee = Coffee()

    print("Making tea...")
    tea.prepareRecipe()

    print("\nMaking coffee...")
    coffee.prepareRecipe()

if __name__ == "__main__":
    main()

Explicación del Código

  1. Clase Abstracta CaffeineBeverage:

    • Define el método template prepareRecipe que llama a los métodos boilWater, brew, pourInCup y addCondiments.
    • brew y addCondiments son métodos abstractos que deben ser implementados por las subclases.
  2. Subclase Tea:

    • Implementa el método brew para preparar el té.
    • Implementa el método addCondiments para añadir limón.
  3. Subclase Coffee:

    • Implementa el método brew para preparar el café.
    • Implementa el método addCondiments para añadir azúcar y leche.

Ejecución del Código

Al ejecutar el código, se obtiene la siguiente salida:

Making tea...
Boiling water
Steeping the tea
Pouring into cup
Adding lemon

Making coffee...
Boiling water
Dripping coffee through filter
Pouring into cup
Adding sugar and milk

Ejercicio Práctico

Ejercicio

Implementa una clase HotChocolate que herede de CaffeineBeverage y redefine los métodos brew y addCondiments.

Solución

class HotChocolate(CaffeineBeverage):
    def brew(self):
        print("Mixing hot chocolate powder")

    def addCondiments(self):
        print("Adding whipped cream")

# Uso del patrón Template Method
def main():
    tea = Tea()
    coffee = Coffee()
    hot_chocolate = HotChocolate()

    print("Making tea...")
    tea.prepareRecipe()

    print("\nMaking coffee...")
    coffee.prepareRecipe()

    print("\nMaking hot chocolate...")
    hot_chocolate.prepareRecipe()

if __name__ == "__main__":
    main()

Explicación de la Solución

  1. Clase HotChocolate:
    • Implementa el método brew para mezclar el polvo de chocolate caliente.
    • Implementa el método addCondiments para añadir crema batida.

Ejecución del Código

Al ejecutar el código, se obtiene la siguiente salida:

Making tea...
Boiling water
Steeping the tea
Pouring into cup
Adding lemon

Making coffee...
Boiling water
Dripping coffee through filter
Pouring into cup
Adding sugar and milk

Making hot chocolate...
Boiling water
Mixing hot chocolate powder
Pouring into cup
Adding whipped cream

Conclusión

El patrón Template Method es útil cuando se tiene un algoritmo común con pasos que pueden variar entre diferentes implementaciones. Permite reutilizar el código común y delegar las partes específicas a las subclases. Este patrón es ampliamente utilizado en frameworks y bibliotecas para permitir la personalización de comportamientos sin modificar el código base.

Resumen

  • Definición: Define el esqueleto de un algoritmo en una operación, diferiendo algunos pasos a las subclases.
  • Componentes: Clase abstracta con método template y métodos abstractos, subclases concretas que implementan los métodos abstractos.
  • Ventajas: Reutilización de código, flexibilidad para cambiar partes del algoritmo.
  • Ejemplo: Preparación de bebidas como té, café y chocolate caliente.

En el siguiente tema, exploraremos el patrón Visitor, que permite agregar nuevas operaciones a objetos sin cambiar sus clases.

© Copyright 2024. Todos los derechos reservados