Звезда не активнаЗвезда не активнаЗвезда не активнаЗвезда не активнаЗвезда не активна
 

Позволяет объекту варьировать свое поведение при изменении внутреннего состояния. При этом создается впечатление, что поменялся класс объекта.

Назначение

Позволяет объекту варьировать свое поведение в зависимости от внутреннего состояния. Извне создается впечатление, что изменился класс объекта.

Применимость

Используйте паттерн состояние в следующих случаях:

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

Структура

Участники

  • Context - контекст:
    • определяет интерфейс, представляющий интерес для клиентов;
    • хранит экземпляр класса ConcreteState, которым определяется текущее состояние;
  • State - состояние - определяет интерфейс для инкапсуляции поведения, ассоциированного с конкретным состоянием контекста Context;
  • ConcreteState - конкретное состояние - каждый класс реализует поведение, ассоциированное с некоторым состоянием контекста Context.

Результаты

  • локализует зависящее от состояния поведение и делит его на части, соответствующие состояниям. Паттерн состояние помещает все поведение, ассоциированное с конкретным состоянием, в отдельный объект. Поскольку зависящий от состояния код целиком находится в одном из подклассов класса State, то добавлять новые состояния и переходя можно просто путем порождения новых подклассов;
  • поскольку поведение для различных состояний оказывается распределенным по нескольким подклассам класса State, это увеличивает число классов;
  • делает явными переходы между состояниями. Кроме того объекты State могут защитить контекст Context от рассогласования внутренних переменных, поскольку переходы с точки зрения контекста - это атомарные действия. Для осуществления перехода надо изменить значение только одной переменной;
  • объекты состояния можно разделять. Если в объекте состояния State отсутствуют переменные экземпляра, то есть представляемое им состояние кодируется исключительно самим типом, то разные контексты могут разделять один и тот же объект State. Когда состояния разделяются таким образом, они являются, по сути дела, приспособленцами(см. описание паттерна приспособленец), у которых нет внутреннего состояния, а есть только поведение.