Назад к вопросам
Middle
64
questionbank

Что такое паттерн проектирования 'Шаблонный метод' (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()