Menu
Coddy logo textTech

Patrón Template Method

Parte de la sección Object Oriented Programming del Journey de Python de Coddy — lección 52 de 64.

El patrón Template Method define el esqueleto de un algoritmo en una clase base, permitiendo que las subclases sobrescriban pasos específicos sin cambiar la estructura del algoritmo.

Aquí hay una clase base con un método de plantilla:

class DataProcessor:
    def process(self):
        """Template method defining the algorithm structure"""
        self.read_data()
        self.process_data()
        self.save_data()
    
    def read_data(self):
        print("Reading data...")
    
    def process_data(self):
        raise NotImplementedError("Subclasses must implement this")
    
    def save_data(self):
        print("Saving data...")

El método de plantilla process() define los pasos del algoritmo, mientras que process_data() se deja para que las subclases lo implementen.

Crea clases concretas que implementen el método abstracto:

class CSVProcessor(DataProcessor):
    def process_data(self):
        print("Processing CSV data")

class JSONProcessor(DataProcessor):
    def process_data(self):
        print("Processing JSON data")

Cada clase concreta proporciona su propia implementación del paso requerido.

Usa el método de plantilla:

csv_processor = CSVProcessor()
csv_processor.process()

print()  # Línea vacía

json_processor = JSONProcessor()
json_processor.process()

Crea otro ejemplo con una plantilla de juego:

class Game:
    def play(self):
        """Template method for playing a game"""
        self.start_game()
        self.play_game()
        self.end_game()
    
    def start_game(self):
        print("Game started!")
    
    def play_game(self):
        raise NotImplementedError("Define the game rules")
    
    def end_game(self):
        print("Game ended!")

class Chess(Game):
    def play_game(self):
        print("Playing chess - thinking strategically...")

class Soccer(Game):
    def play_game(self):
        print("Playing soccer - running and kicking...")

chess = Chess()
chess.play()

Salida:

Reading data...
Processing CSV data
Saving data...

Reading data...
Processing JSON data
Saving data...
Game started!
Playing chess - thinking strategically...
Game ended!

Punto clave: El patrón Template Method define una estructura de algoritmo común en la clase padre, permitiendo que las subclases personalicen pasos específicos. La clase padre controla el flujo general, pero las subclases proporcionan las implementaciones específicas. Esto garantiza una estructura consistente al tiempo que permite flexibilidad en los pasos individuales.

challenge icon

Desafío

Intermedio

Implementa template.py y driver.py con la encapsulación y los métodos adecuados. Sigue los comentarios TODO para obtener una guía paso a paso.

Hoja de referencia

El patrón Template Method define el esqueleto de un algoritmo en una clase base, permitiendo que las subclases sobrescriban pasos específicos sin cambiar la estructura del algoritmo.

Crea una clase base con un método de plantilla:

class DataProcessor:
    def process(self):
        """Método de plantilla que define la estructura del algoritmo"""
        self.read_data()
        self.process_data()
        self.save_data()
    
    def read_data(self):
        print("Reading data...")
    
    def process_data(self):
        raise NotImplementedError("Subclasses must implement this")
    
    def save_data(self):
        print("Saving data...")

Crea clases concretas que implementen el método abstracto:

class CSVProcessor(DataProcessor):
    def process_data(self):
        print("Processing CSV data")

class JSONProcessor(DataProcessor):
    def process_data(self):
        print("Processing JSON data")

Usa el método de plantilla:

csv_processor = CSVProcessor()
csv_processor.process()

json_processor = JSONProcessor()
json_processor.process()

El patrón Template Method define una estructura de algoritmo común en la clase padre, mientras permite que las subclases personalicen pasos específicos. La clase padre controla el flujo general, pero las subclases proporcionan las implementaciones específicas.

Pruébalo tú mismo

from template import Template

# Manejador de casos de prueba
test_case = input()

if test_case == "basic_test":
    # TODO: Crear un objeto Template con el nombre "Test Name"
    # TODO: Llamar al método display_info() en el objeto
    pass
elif test_case == "validation_test":
    # TODO: Crear un objeto Template con el nombre "Validation Test"
    # TODO: Imprimir el nombre usando la propiedad name en el formato: "Name: {obj.name}"
    pass
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Object Oriented Programming