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
prepareRecipeque llama a los métodosboilWater,brew,pourInCupyaddCondiments. brewyaddCondimentsson métodos abstractos que deben ser implementados por las subclases.
- Define el método template
-
Subclase
Tea:- Implementa el método
brewpara preparar el té. - Implementa el método
addCondimentspara añadir limón.
- Implementa el método
-
Subclase
Coffee:- Implementa el método
brewpara preparar el café. - Implementa el método
addCondimentspara 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
brewpara mezclar el polvo de chocolate caliente. - Implementa el método
addCondimentspara 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
