Шаблон проектирования State GoF представляет собой эффективный способ управления состоянием объекта в программном коде. Этот шаблон особенно полезен, когда объект может находиться в различных состояниях и его поведение зависит от текущего состояния.
В этой статье мы рассмотрим простую реализацию шаблона конечного автомата State GoF для управления состоянием документа. Документ будет проходить через несколько этапов: Черновик, Обзор, Утверждение и Публикация.
Для начала, нам понадобится определить класс DocumentState, который представляет состояние документа:
<?php
class DocumentState {
protected $context;
public function setContext(DocumentContext $context) {
$this->context = $context;
}
// Методы для различных действий в разных состояниях
public function draft() {}
public function review() {}
public function approve() {}
public function publish() {}
}
?>
Класс DocumentState предоставляет методы, соответствующие всем возможным действиям, которые можно выполнить в каждом состоянии документа. На этом этапе эти методы остаются пустыми, поскольку каждое состояние будет переопределять только те методы, которые соответствуют его действиям.
Теперь мы определим класс DocumentDraftState, который представляет состояние "Черновик":
<?php
class DocumentDraftState extends DocumentState {
public function draft() {
// Действия, выполняемые при переходе в состояние "Черновик"
// Например, установка статуса документа в "Черновик"
$this->context->setStatus("Черновик");
}
public function review() {
// Действия, выполняемые при переходе в состояние "Обзор"
// Например, установка статуса документа в "Обзор"
$this->context->setStatus("Обзор");
$this->context->setState(new DocumentReviewState());
}
}
?>
Класс DocumentDraftState переопределяет методы draft() и review(), чтобы определить действия в состоянии "Черновик". При переходе в состояние "Обзор" мы также изменяем статус документа с помощью метода setStatus() и устанавливаем новое состояние с помощью метода setState().
Теперь, чтобы завершить реализацию машины состояний документа, нам нужно также определить классы для состояний "Обзор", "Утверждение" и "Публикация". Эти классы будут иметь похожую структуру на класс DocumentDraftState, но будут содержать свои собственные действия при переходах между состояниями.
Класс DocumentContext представляет контекст, в котором работает машина состояний документа:
<?php
class DocumentContext {
protected $state;
protected $status;
public function __construct() {
$this->state = new DocumentDraftState();
$this->state->setContext($this);
$this->setStatus("Черновик");
}
public function setState(DocumentState $state) {
$this->state = $state;
$this->state->setContext($this);
}
public function getStatus() {
return $this->status;
}
public function setStatus($status) {
$this->status = $status;
}
// Методы, вызываемые для выполнения действий в текущем состоянии
public function draft() {
$this->state->draft();
}
public function review() {
$this->state->review();
}
public function approve() {
$this->state->approve();
}
public function publish() {
$this->state->publish();
}
}
?>
Класс DocumentContext содержит методы для выполнения действий в текущем состоянии. Когда вызывается один из этих методов, соответствующий метод в текущем состоянии документа будет выполнен. Класс также отслеживает текущее состояние и статус документа.
Теперь, когда мы создали все необходимые классы, мы можем использовать машину состояний документа следующим образом:
<?php
// Создание экземпляра машины состояний документа
$document = new DocumentContext();
// Вывод текущего статуса документа
echo "Текущий статус документа: " . $document->getStatus() . "<br>";
// Переход в состояние "Обзор"
$document->review();
// Вывод нового статуса документа
echo "Новый статус документа: " . $document->getStatus() . "<br>";
?>
Результат выполнения кода:
Текущий статус документа: Черновик
Новый статус документа: Обзор
В этом примере мы создаем экземпляр машины состояний документа, выводим текущий статус документа, переходим в состояние "Обзор" и выводим новый статус документа.
Таким образом, мы успешно создали простую реализацию шаблона конечного автомата State GoF для управления состоянием "машины состояний документов" с использованием PHP 7.4.