Menu
Coddy logo textTech

Padrão Template Method

Parte da seção Object Oriented Programming do Journey de Python da Coddy — lição 52 de 64.

O padrão Template Method define o esqueleto de um algoritmo em uma classe base, permitindo que subclasses sobrescrevam etapas específicas sem alterar a estrutura do algoritmo.

Aqui está uma classe base com um método template:

class DataProcessor:
    def process(self):
        """Método template definindo a estrutura do 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...")

O método template process() define os passos do algoritmo, enquanto process_data() é deixado para as subclasses implementarem.

Crie classes concretas que implementam o método abstrato:

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

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

Cada classe concreta fornece sua própria implementação da etapa exigida.

Use o template method:

csv_processor = CSVProcessor()
csv_processor.process()

print()  # Linha vazia

json_processor = JSONProcessor()
json_processor.process()

Crie outro exemplo com um modelo de jogo:

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()

Saída:

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

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

Ponto-chave: O padrão Template Method define uma estrutura de algoritmo comum na classe pai, permitindo que as subclasses customizem etapas específicas. A classe pai controla o fluxo geral, mas as subclasses fornecem as implementações específicas. Isso garante uma estrutura consistente, permitindo flexibilidade em etapas individuais.

challenge icon

Desafio

Médio

Implemente o template.py e o driver.py com encapsulamento e métodos adequados. Siga os comentários TODO para orientação passo a passo.

Folha de consulta

O padrão Template Method define o esqueleto de um algoritmo em uma classe base, permitindo que as subclasses substituam etapas específicas sem alterar a estrutura do algoritmo.

Crie uma classe base com um método template:

class DataProcessor:
    def process(self):
        """Método template definindo a estrutura do 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...")

Crie classes concretas que implementam o método abstrato:

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

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

Use o método template:

csv_processor = CSVProcessor()
csv_processor.process()

json_processor = JSONProcessor()
json_processor.process()

O padrão Template Method define uma estrutura de algoritmo comum na classe pai, permitindo que as subclasses personalizem etapas específicas. A classe pai controla o fluxo geral, mas as subclasses fornecem as implementações específicas.

Experimente você mesmo

from template import Template

# Manipulador de caso de teste
test_case = input()

if test_case == "basic_test":
    # TODO: Criar um objeto Template com o nome "Test Name"
    # TODO: Chamar o método display_info() no objeto
    pass
elif test_case == "validation_test":
    # TODO: Criar um objeto Template com o nome "Validation Test"
    # TODO: Imprimir o nome usando a propriedade name no formato: "Name: {obj.name}"
    pass
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Object Oriented Programming