Sobes.tech
Назад к вопросам
Middle
143
questionbank

Что такое паттерн проектирования Состояние (State)?

Sobes Copilot

Получайте ответы в реальном времени

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

sobes.tech AI

Паттерн проектирования Состояние (State) позволяет объекту изменять свое поведение в зависимости от своего внутреннего состояния. Выглядит так, будто объект изменил свой класс. Объект делегирует выполнение действий отдельным объектам-состояниям, каждый из которых реализует один и тот же интерфейс.

Основные элементы:

  • Context (Контекст): Объект, чье поведение меняется в зависимости от состояния. Он содержит ссылку на текущее состояние.
  • State (Состояние): Интерфейс или абстрактный класс, определяющий набор методов, которые должны реализовать все конкретные состояния.
  • ConcreteState (Конкретное Состояние): Реализация интерфейса State, представляющая конкретное состояние контекста.

Принцип работы:

Контекст получает запрос и делегирует его обработку текущему объекту ConcreteState. Объект ConcreteState выполняет соответствующее действие и, при необходимости, меняет состояние контекста, устанавливая в нем ссылку на новое ConcreteState.

Преимущества:

  • Убирает большие условные конструкции (if/elif/else или switch) из кода контекста.
  • Делает добавление новых состояний более простым, не изменяя существующие классы.
  • Каждое состояние инкапсулировано в отдельном классе, что улучшает читаемость и поддерживаемость кода.

Недостатки:

  • Увеличивает количество классов в приложении.
  • Может быть избыточным для очень простых состояний.

Python-реализация (пример):

class State:
    // Интерфейс состояния
    def handle(self, context):
        pass

class ConcreteStateA(State):
    // Конкретное состояние A
    def handle(self, context):
        print("Handling in State A.")
        context.set_state(ConcreteStateB())

class ConcreteStateB(State):
    // Конкретное состояние B
    def handle(self, context):
        print("Handling in State B.")
        context.set_state(ConcreteStateA())

class Context:
    // Контекст
    def __init__(self, state):
        self._state = state

    def set_state(self, state):
        // Установить текущее состояние
        self._state = state

    def request(self):
        // Делегировать обработку текущему состоянию
        self._state.handle(self)

// Использование:
context = Context(ConcreteStateA())
context.request() // Вывод: Handling in State A.
context.request() // Вывод: Handling in State B.