Назначение: позволяет объекту варьировать свое поведение в зависимости от внутреннего состояния, извне создается впечатление, что изменился класс объекта.
Общая структура решения.
Context – контекст: определяет интерфейс, представляющий интерес для клиентов; хранит указатель на экземпляр подкласса State, которым определяется текущее состояние.
State – состояние: определяет интерфейс для инкапсуляции поведения, ассоциированного с конкретным состоянием контекста Context.
ConcreteState – конкретные состояния: каждый класс ConcreteState реализует поведение, ассоциированное с некоторым состоянием контекста Context.
Класс Context делегирует зависящие от состояния запросы текущему объекту ConcreteState. Контекст может передать себя в качестве аргумента объекту State, который будет обрабатывать запрос. Это дает возможность объекту-состоянию при необходимости получить доступ к контексту.
Context – это основной интерфейс для клиентов. Клиенты могут конфигурировать контекст объектами состояния State. Один раз сконфигурировав контекст, клиенты уже не должны напрямую связываться с объектами состояния.