Паттерн Шаблонный метод
Часть раздела 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) определяет общую структуру алгоритма в родительском классе, позволяя подклассам переопределять отдельные шаги. Родительский класс управляет общим порядком выполнения, но подклассы предоставляют конкретные реализации. Это гарантирует неизменность структуры при сохранении гибкости в реализации отдельных этапов.
Задание
СреднеРеализуйте 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В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Object Oriented Programming
1Основы ООП
Внешние файлыВведение в ООПКлассы и объектыПараметр selfМетодыАтрибутыМетод-конструктор (__init__)Повторение — Простой калькулятор4Наследование
Базовое наследованиеФункция super()Переопределение методовМножественное наследованиеПорядок разрешения методовИтоги — Иерархия сотрудников7Специальные методы
Введение в магические методыПерегрузка операторовМагические методы контейнеровПовторение — Пользовательский список10Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн SingletonПаттерн FactoryПаттерн ObserverПаттерн Strategy5Полиморфизм
Снова о переопределении методовУтиная типизацияАбстрактные классы и методыПроектирование интерфейсовИтоги — Калькулятор фигур8Продвинутые концепции ООП
Композиция против наследованияМиксиныСтатические методы и методы классаДекораторы классовМенеджеры контекста11Паттерны проектирования. Часть 2
Паттерн КомандаПаттерн АдаптерПаттерн ДекораторПаттерн Шаблонный методПаттерн СостояниеПаттерн Компоновщик3Свойства классов
Переменные экземпляра и классаДекораторы свойствПриватные атрибутыИтоги — Менеджер банковского счета6Инкапсуляция
Public, Protected, Private члены классаМодификаторы доступаСокрытие данныхДекораторы property: продвинутый уровеньИтоги: Система учета студентов12Проект: Управление библиотекой
Обзор проектаКлассы Book и User