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:
- Clase Abstracta: Define el método template y los métodos abstractos.
- 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
-
Clase Abstracta
CaffeineBeverage
:- Define el método template
prepareRecipe
que llama a los métodosboilWater
,brew
,pourInCup
yaddCondiments
. brew
yaddCondiments
son métodos abstractos que deben ser implementados por las subclases.
- Define el método template
-
Subclase
Tea
:- Implementa el método
brew
para preparar el té. - Implementa el método
addCondiments
para añadir limón.
- Implementa el método
-
Subclase
Coffee
:- Implementa el método
brew
para preparar el café. - Implementa el método
addCondiments
para añadir azúcar y leche.
- Implementa el método
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
- Clase
HotChocolate
:- Implementa el método
brew
para mezclar el polvo de chocolate caliente. - Implementa el método
addCondiments
para añadir crema batida.
- Implementa el método
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.
Curso de Patrones de Diseño de Software
Módulo 1: Introducción a los Patrones de Diseño
- ¿Qué son los Patrones de Diseño?
- Historia y Origen de los Patrones de Diseño
- Clasificación de los Patrones de Diseño
- Ventajas y Desventajas de Usar Patrones de Diseño
Módulo 2: Patrones Creacionales
- Introducción a los Patrones Creacionales
- Singleton
- Factory Method
- Abstract Factory
- Builder
- Prototype
Módulo 3: Patrones Estructurales
Módulo 4: Patrones de Comportamiento
- Introducción a los Patrones de Comportamiento
- Chain of Responsibility
- Command
- Interpreter
- Iterator
- Mediator
- Memento
- Observer
- State
- Strategy
- Template Method
- Visitor
Módulo 5: Aplicación de Patrones de Diseño
- Cómo Seleccionar el Patrón Adecuado
- Ejemplos Prácticos de Uso de Patrones
- Patrones de Diseño en Proyectos Reales
- Refactorización Usando Patrones de Diseño
Módulo 6: Patrones de Diseño Avanzados
- Patrones de Diseño en Arquitecturas Modernas
- Patrones de Diseño en Microservicios
- Patrones de Diseño en Sistemas Distribuidos
- Patrones de Diseño en Desarrollo Ágil