Состояние (State)

Метафора

 

В реальной жизни каждый человек может прибывать в разных состояниях. Если вы устали, то на предложение «Сходи в магазин», вы скорее ответите «Не пойду, я устал». А если вы не устали, тогда скорее всего вы ответите «Уже иду». Таким образом, ваше поведение зависит от того, в каком состоянии Вы прибываете.

 

Назначение

 

Используется в тех случаях, когда:

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

Паттерн может быть своего рода представлением в виде ООП реализации конечного автомата (см. пример).

 

Диаграмма

 

Состояние

Состояние

Context делегирует операции по переходу между состояниями объектам State, что позволяет перейти из одного конкретного состояния ConcreteState1 в другое ConcreteState2.

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

В описании паттерна GOF не говорится где именно определяется условие перехода в новое состояние. Существует два варианта: класс Context или подклассы State. Преимущество последнего варианта заключается в простоте добавления новых производных классов. Недостаток заключается в том, что каждый подкласс State для осуществления перехода в новое состояние должен знать о своих соседях, что вводит зависимости между подклассами.

 

Пример

До паттерна:

Класс lcl_water изменяет своё поведение в зависимости от состояния, но решение получается сложным, т.к. нам при добавлении нового состояния нам придётся влезать во все CASE конструкции. Попробуем применить State паттерн:

Реализовав паттерн «Состояние» мы вынесли поведение, зависящее от текущего состояния объекта, в отдельные классы, и избежали перегруженности методов объекта условными конструкциями. Кроме того, при необходимости мы можем ввести в систему новые классы состояний.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *