Что такое паттерн проектирования 'Шаблонный метод' (Template Method)?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
"Шаблонный метод" — это поведенческий паттерн проектирования, который определяет основу алгоритма в базовом классе, позволяя подклассам переопределять определенные шаги этого алгоритма, не изменяя его структуру в целом.
Ключевые компоненты:
- Абстрактный базовый класс: Содержит шаблонный метод и абстрактные или конкретные методы, представляющие шаги алгоритма.
- Конкретные подклассы: Наследуют абстрактный базовый класс и реализуют абстрактные методы, предоставляя специфическую логику для определенных шагов, или переопределяют конкретные методы.
- Шаблонный метод: Неабстрактный метод в базовом классе, который определяет последовательность вызовов других методов (абстрактных, конкретных или методов-зацепок), формируя каркас алгоритма.
Принцип работы:
Базовый класс определяет "скелет" алгоритма в шаблонном методе. Некоторые шаги этого алгоритма могут быть реализованы в базовом классе (конкретные методы), а другие остаются абстрактными, требуя реализации в подклассах. Также могут быть предусмотрены методы-зацепки (hook methods) – необязательные переопределяемые методы, которые позволяют подклассам расширять функциональность на определенных этапах алгоритма, но не являются его обязательными шагами.
Преимущества:
- Позволяет повторно использовать код базового класса.
- Обеспечивает гибкость, позволяя подклассам настраивать части алгоритма.
- Ограничивает возможности изменения структуры алгоритма, так как шаблонный метод остается неизменным.
Недостатки:
- Повышает сложность кода из-за необходимости создания иерархии классов.
- Некоторые подклассы могут быть вынуждены реализовывать методы, которые им не нужны.
Пример:
Представим процесс приготовления напитка. Базовый класс BeverageTemplate определяет шаги: заварить, добавить ингредиенты, налить в чашку. Подклассы Tea и Coffee реализуют специфические шаги "заварить" и "добавить ингредиенты".
# Абстрактный базовый класс (может быть и обычный класс,
# если все шаги имеют базовую реализацию)
class BeverageTemplate:
def prepare_beverage(self):
# Шаблонный метод - определяет структуру алгоритма
self.boil_water()
self.brew()
self.pour_in_cup()
self.add_condiments()
def boil_water(self):
# Конкретный шаг с реализацией по умолчанию
print("Boiling water")
# Абстрактные шаги - должны быть реализованы в подклассах
def brew(self):
raise NotImplementedError("Subclass must implement abstract method")
def add_condiments(self):
raise NotImplementedError("Subclass must implement abstract method")
def pour_in_cup(self):
# Конкретный шаг с реализацией по умолчанию
print("Pouring into cup")
# Конкретные подклассы
class Coffee(BeverageTemplate):
def brew(self):
print("Dripping coffee through filter")
def add_condiments(self):
print("Adding sugar and milk")
class Tea(BeverageTemplate):
def brew(self):
print("Steeping the tea bag")
def add_condiments(self):
print("Adding lemon")
# Использование
print("Making coffee...")
coffee_maker = Coffee()
coffee_maker.prepare_beverage()
print("\nMaking tea...")
tea_maker = Tea()
tea_maker.prepare_beverage()