Состояние (шаблон проектирования)

Состояние (англ. State) — поведенческий шаблон проектирования. Используется в тех случаях, когда во время выполнения программы объект должен менять своё поведение в зависимости от своего состояния.

Состояние
State
Тип поведенческий
Описан в Design Patterns Да

Паттерн состоит из 3 блоков:

Widget — класс, объекты которого должны менять своё поведение в зависимости от состояния.

IState — интерфейс, который должен реализовать каждое из конкретных состояний. Через этот интерфейс объект Widget взаимодействует с состоянием, делегируя ему вызовы методов. Интерфейс должен содержать средства для обратной связи с объектом, поведение которого нужно изменить. Для этого используется событие (паттерн Publisher — Subscriber). Это необходимо для того, чтобы в процессе выполнения программы заменять объект состояния при появлении событий. Возможны случаи, когда сам Widget периодически опрашивает объект состояния на наличие перехода.

StateA … StateZ — классы конкретных состояний. Должны содержать информацию о том, при каких условиях и в какие состояния может переходить объект из текущего состояния. Например, из StateA объект может переходить в состояние StateB и StateC, а из StateB — обратно в StateA и так далее. Объект одного из них должен содержать Widget при создании.

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

Примеры править

Пример на C++ править

Пример на C# править

Применение шаблона

Тот же пример, без применения шаблона

Пример на Java править

Пример на Python править

Пример на Javascript править

Пример со сменой состояний из State.

Смена состояний с помощью вызова метода у Widget (из англоязычной версии статьи).

Пример на CoffeeScript править

Пример на VB.NET править

Применение шаблона

Тот же пример, без применения шаблона

Пример на PHP5 править