Sobes.tech
Back to questions
Middle
142
questionbank

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

Sobes Copilot

Get answers in real time

Answer from AI

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.