Sobes.tech
Назад к вопросам
Junior — Middle
55

Можешь перечислить основные поведенческие паттерны, используемые в разработке программных систем?

Ответ от нейросети

sobes.tech AI

Что хотят услышать интервьюеры:

Поведенческие паттерны описывают, как объекты взаимодействуют друг с другом и распределяют ответственность между собой. Обычно ожидают, что будут названы основные паттерны из GoF и кратко объяснено, где они применяются. Важно показать понимание не только названий, но и решаемых ими задач.

Определение:

Поведенческие паттерны — это шаблоны проектирования, которые помогают организовать коммуникацию между объектами, управление алгоритмами, состояниями и обязанностями. Они упрощают изменение поведения системы без жесткой связности между компонентами.

К основным поведенческим паттернам обычно относят:

  • Chain of Responsibility — передача запроса по цепочке обработчиков.
  • Command — инкапсуляция запроса в объект.
  • Iterator — последовательный доступ к элементам коллекции без раскрытия ее внутреннего устройства.
  • Mediator — вынос сложного взаимодействия объектов в отдельный посредник.
  • Memento — сохранение и восстановление состояния объекта.
  • Observer — уведомление зависимых объектов об изменении состояния.
  • State — изменение поведения объекта при смене внутреннего состояния.
  • Strategy — взаимозаменяемые алгоритмы с единым интерфейсом.
  • Template Method — каркас алгоритма с переопределяемыми шагами.
  • Visitor — вынос операций над объектами в отдельные классы.

Пример использования:

Например, в Python для оплаты можно выбрать стратегию в зависимости от способа оплаты: карта, PayPal, бонусы. В этом случае код не разрастается if/elif, а поведение подменяется объектом стратегии.

from abc import ABC, abstractmethod

class PaymentStrategy(ABC):
    @abstractmethod
    def pay(self, amount: float) -> None:
        pass

class CardPayment(PaymentStrategy):
    def pay(self, amount: float) -> None:
        print(f"Оплата картой: {amount}")

class PayPalPayment(PaymentStrategy):
    def pay(self, amount: float) -> None:
        print(f"Оплата через PayPal: {amount}")

class Checkout:
    def __init__(self, strategy: PaymentStrategy):
        self.strategy = strategy

    def set_strategy(self, strategy: PaymentStrategy) -> None:
        self.strategy = strategy

    def complete_payment(self, amount: float) -> None:
        self.strategy.pay(amount)

checkout = Checkout(CardPayment())
checkout.complete_payment(100)

checkout.set_strategy(PayPalPayment())
checkout.complete_payment(200)

Пояснение кода:

Код показывает паттерн Strategy.
PaymentStrategy задает общий интерфейс для всех способов оплаты.
CardPayment и PayPalPayment реализуют разные алгоритмы оплаты.
Checkout хранит ссылку на стратегию и вызывает ее без знания конкретной реализации.
Это позволяет менять способ оплаты во время выполнения и легко добавлять новые варианты без изменения Checkout.

Ключевые моменты:

  • Поведенческие паттерны отвечают за взаимодействие объектов и распределение обязанностей.
  • Самые часто обсуждаемые на собеседованиях: Strategy, Observer, Command, State, Chain of Responsibility.
  • Их главная польза — снижение связности и упрощение расширения поведения.
  • На практике часто используются в обработке событий, бизнес-логике, UI, очередях задач и workflow.
  • На собеседовании важно уметь не только перечислить паттерны, но и объяснить, какую проблему решает каждый.