Паттерн «Состояние» (State). Описание и пример реализации

Паттерн «Состояние» применяется, когда объект программы в зависимости от своего состояния меняет своё поведение.

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

Данный паттерн призван сделать более гибкой архитектуру систем, которые описывают подобные объекты и манипулируют ими.

Описание

Паттерн состоит из трёх элементов:

  • Context – контекст.
    объект, который должен варьировать своё поведение в зависимости от состояния;
  • State – состояние.
    Определяет интерфейс для инкапсуляции поведения соответствующего конкретному состоянию объекта Context. Экземпляр этого класса хранится в закрытом поле state класса Context;
  • ConcretteState – конкретное состояние.
    Классы наследники State, которые реализуют поведения соответствующего конкретному состоянию объекта Context.

Ниже представлена диаграмма классов паттерна.

Паттерн "Состояние"

Пример реализации

В качестве примера реализации рассмотрим уже упомянутый автомобиль.

Пусть у автомобиля будет два состояния «двигатель запущен» и «двигатель остановлен». Также у автомобиля можно изменять скорость.

Реализацию примера выполним на языке программирования C#.

Опишем класс автомобиля. Назначение свойств и методов пояснено в комментариях к исходному коду.

 Классы, которые описывают состояния автомобиля, будут наследоваться от интерфейса ICarState.

 В данном примере, для реализации этих классов используется паттерн «Одиночка» (Singleton), так как он позволяет значительно её упростить.

Состояния реализованы следующим образом.

Когда двигатель автомобиля остановлен, можно только запустить двигатель. Другие действия запрещены (возбуждается исключение).

 Когда же двигатель запущен, можно изменять скорость и остановить двигатель. Однако, остановка двигателя воз только на остановленном автомобиле (скорость равна 0). Также нельзя задать неправильное значение скорости (должно быть больше или равно 0).

По аналогии с предыдущим состоянием, двигатель невозможно выполнить запуск двигателя до тех пор, пока он вновь не будет остановлен.

 Таким образом, с при использовании паттерна «Состояние» вся программная логика, которая отвечает за его поведения в том или ином состоянии инкапсулирована в отдельные классы. Объект и его поведение в различных состояниях могут изменяться независимо друг от друга.

Это обеспечивает высокую гибкость архитектуры и удобство при сопровождении программы и её модернизации

Особенности реализации на языке Delphi

Вследствие того, что работа с интерфейсами в Delphi имеет ряд специфических особенностей, возможности их использования крайне ограничены.

Поэтому при реализации паттерна «Состояние» лучшим решением будет использовать вместо интерфейса абстрактный базовый класс и при реализации конкретных состояний наследоваться от него.

Ниже приведён возможный вариант такого класса, на основе рассмотренного выше примера с автомобилем на C#.

 Источники:
  1. Гамма Э., Хелм Р., Джонсон Р., Влиссидес Дж. Приёмы объектно-ориентированного проектирования. Паттерны проектирования.

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

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