Menu
Coddy logo textTech

Паттерн Шаблонный метод

Часть раздела Object Oriented Programming путешествия по Python на Coddy — урок 52 из 64.

Паттерн Шаблонный метод (Template Method Pattern) определяет основу алгоритма в базовом классе, позволяя подклассам переопределять отдельные шаги, не изменяя структуру самого алгоритма.

Вот базовый класс с шаблонным методом:

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...")

Шаблонный метод process() определяет шаги алгоритма, в то время как process_data() оставляется для реализации подклассами.

Создайте конкретные классы, которые реализуют абстрактный метод:

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

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

Каждый конкретный класс предоставляет свою собственную реализацию требуемого шага.

Используйте шаблонный метод:

csv_processor = CSVProcessor()
csv_processor.process()

print()  # Пустая строка

json_processor = JSONProcessor()
json_processor.process()

Создайте еще один пример с шаблоном игры:

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

Вывод:

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

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

Ключевой момент: Паттерн «Шаблонный метод» (Template Method Pattern) определяет общую структуру алгоритма в родительском классе, позволяя подклассам переопределять отдельные шаги. Родительский класс управляет общим порядком выполнения, но подклассы предоставляют конкретные реализации. Это гарантирует неизменность структуры при сохранении гибкости в реализации отдельных этапов.

challenge icon

Задание

Средне

Реализуйте template.py и driver.py с использованием надлежащей инкапсуляции и методов. Следуйте комментариям TODO для получения пошаговых инструкций.

Шпаргалка

Паттерн «Шаблонный метод» (Template Method) определяет основу алгоритма в базовом классе, позволяя подклассам переопределять определенные шаги, не изменяя структуру алгоритма.

Создайте базовый класс с шаблонным методом:

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...")

Создайте конкретные классы, реализующие абстрактный метод:

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

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

Используйте шаблонный метод:

csv_processor = CSVProcessor()
csv_processor.process()

json_processor = JSONProcessor()
json_processor.process()

Паттерн «Шаблонный метод» определяет общую структуру алгоритма в родительском классе, позволяя подклассам настраивать конкретные шаги. Родительский класс управляет общим потоком выполнения, а подклассы предоставляют конкретные реализации.

Попробуйте сами

from template import Template

# Обработчик тестового случая
test_case = input()

if test_case == "basic_test":
    # TODO: Создать объект Template с именем "Test Name"
    # TODO: Вызвать метод display_info() у объекта
    pass
elif test_case == "validation_test":
    # TODO: Создать объект Template с именем "Validation Test"
    # TODO: Вывести имя, используя свойство name в формате: "Name: {obj.name}"
    pass
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Object Oriented Programming