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

Общая структура решения.

 

 

Context – контекст: определяет интерфейс, представляющий интерес для клиентов; хранит указатель на экземпляр подкласса State, которым определяется текущее состояние.

State – состояние: определяет интерфейс для инкапсуляции поведения, ассоциированного с конкретным состоянием контекста Context.

ConcreteState – конкретные состояния: каждый класс ConcreteState реализует поведение, ассоциированное с некоторым состоянием контекста Context.

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

Context – это основной интерфейс для клиентов. Клиенты могут конфигурировать контекст объектами состояния State. Один раз сконфигурировав контекст, клиенты уже не должны напрямую связываться с объектами состояния.