Шаблон состояния — это поведенческий шаблон проектирования программного обеспечения , который позволяет объекту изменять свое поведение при изменении его внутреннего состояния. Этот шаблон близок к концепции конечных автоматов . Шаблон состояния можно интерпретировать как шаблон стратегии , который способен переключать стратегию посредством вызовов методов, определенных в интерфейсе шаблона.
Шаблон состояния используется в компьютерном программировании для инкапсуляции различного поведения для одного и того же объекта на основе его внутреннего состояния. Это может быть более чистым способом для объекта изменять свое поведение во время выполнения, не прибегая к условным операторам, и таким образом улучшать поддерживаемость. [1] : 395
Шаблон проектирования состояния — один из двадцати трех шаблонов проектирования, задокументированных «Бандой четырех» , которые описывают, как решать повторяющиеся проблемы проектирования. Такие проблемы охватывают проектирование гибкого и повторно используемого объектно-ориентированного программного обеспечения, например, объектов, которые легко реализовать, изменить, протестировать и повторно использовать. [3]
Модель состояния призвана решить две основные проблемы: [4]
Реализация поведения, специфичного для состояния, непосредственно в классе негибка, поскольку она обязывает класс к определенному поведению и делает невозможным добавление нового состояния или изменение поведения существующего состояния позже, независимо от класса, без изменения класса. В этом случае шаблон описывает два решения:
Это делает класс независимым от того, как реализовано поведение, специфичное для состояния. Новые состояния могут быть добавлены путем определения новых классов состояний. Класс может изменить свое поведение во время выполнения, изменив свой текущий объект состояния.
В прилагаемой диаграмме классов Unified Modeling Language (UML) класс не реализует поведение, зависящее от состояния, напрямую. Вместо этого ссылается на интерфейс для выполнения поведения, зависящего от состояния ( ), что делает независимым от того, как реализуется поведение, зависящее от состояния. Классы и реализуют интерфейс, то есть реализуют (инкапсулируют) поведение, зависящее от состояния, для каждого состояния. Диаграмма последовательности UML показывает взаимодействия во время выполнения:Context
Context
State
state.handle()
Context
ConcreteStateA
ConcreteStateB
State
Объект Context
делегирует поведение, зависящее от состояния, разным State
объектам. Сначала Context
вызывает handle(this)
свой текущий (начальный) объект состояния ( ConcreteStateA
), который выполняет операцию и вызывает setState(ConcreteStateB)
для Context
изменения текущего состояния контекста на ConcreteStateB
. В следующий раз Context
снова вызывает handle(this)
свой текущий объект состояния ( ConcreteStateB
), который выполняет операцию и изменяет текущее состояние контекста на ConcreteStateA
.