Шаблон состояния — это поведенческий шаблон проектирования программного обеспечения , который позволяет объекту изменять свое поведение при изменении его внутреннего состояния. Эта закономерность близка к концепции конечных автоматов . Шаблон состояния можно интерпретировать как шаблон стратегии , который способен переключать стратегию посредством вызовов методов, определенных в интерфейсе шаблона.
Шаблон состояния используется в компьютерном программировании для инкапсуляции различного поведения одного и того же объекта в зависимости от его внутреннего состояния. Это может быть более простым способом изменить свое поведение объекта во время выполнения, не прибегая к условным операторам, и, таким образом, улучшить удобство обслуживания. [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
.