Позволяет объекту варьировать свое поведение при изменении внутреннего состояния. При этом создается впечатление, что поменялся класс объекта.
Назначение
Позволяет объекту варьировать свое поведение в зависимости от внутреннего состояния. Извне создается впечатление, что изменился класс объекта.
Применимость
Используйте паттерн состояние в следующих случаях:
- когда поведение объекта зависит от его состояния и должно изменяться во время выполнения;
- когда в коде операции встречаются состоящие из многих ветвей условные операторы, в которых выбор ветви зависит от состояния. Обычно в таком случае состояние представлено перечисляемыми константами. Часто одна и та же структура условного оператора повторяется в нескольких операциях. Паттерн состояния предлагает переместить каждую ветвь в отдельный класс. Это позволяет трактовать состояние объекта как самостоятельный объект, который может изменяться независимо от других.
Структура
Участники
- Context - контекст:
- определяет интерфейс, представляющий интерес для клиентов;
- хранит экземпляр класса ConcreteState, которым определяется текущее состояние;
- State - состояние - определяет интерфейс для инкапсуляции поведения, ассоциированного с конкретным состоянием контекста Context;
- ConcreteState - конкретное состояние - каждый класс реализует поведение, ассоциированное с некоторым состоянием контекста Context.
Результаты
- локализует зависящее от состояния поведение и делит его на части, соответствующие состояниям. Паттерн состояние помещает все поведение, ассоциированное с конкретным состоянием, в отдельный объект. Поскольку зависящий от состояния код целиком находится в одном из подклассов класса State, то добавлять новые состояния и переходя можно просто путем порождения новых подклассов;
- поскольку поведение для различных состояний оказывается распределенным по нескольким подклассам класса State, это увеличивает число классов;
- делает явными переходы между состояниями. Кроме того объекты State могут защитить контекст Context от рассогласования внутренних переменных, поскольку переходы с точки зрения контекста - это атомарные действия. Для осуществления перехода надо изменить значение только одной переменной;
- объекты состояния можно разделять. Если в объекте состояния State отсутствуют переменные экземпляра, то есть представляемое им состояние кодируется исключительно самим типом, то разные контексты могут разделять один и тот же объект State. Когда состояния разделяются таким образом, они являются, по сути дела, приспособленцами(см. описание паттерна приспособленец), у которых нет внутреннего состояния, а есть только поведение.