Создание реализации шаблона конечного автомата State GoF для машины состояний документов на PHP 7.4

Создание реализации шаблона конечного автомата State GoF для машины состояний документов на PHP 7.4
Создание реализации шаблона конечного автомата State GoF для машины состояний документов на PHP 7.4 - vishnurnair @ Unsplash

Создание простой реализации шаблона конечного автомата State GoF для "машины состояний документов" с использованием PHP 7.4

Шаблон проектирования State GoF представляет собой эффективный способ управления состоянием объекта в программном коде. Этот шаблон особенно полезен, когда объект может находиться в различных состояниях и его поведение зависит от текущего состояния.

В этой статье мы рассмотрим простую реализацию шаблона конечного автомата State GoF для управления состоянием документа. Документ будет проходить через несколько этапов: Черновик, Обзор, Утверждение и Публикация.

Определение класса DocumentState

Для начала, нам понадобится определить класс 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

Теперь мы определим класс 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

Класс 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.


LetsCodeIt, 13 августа 2023 г., 10:44

Похожие посты

React - создание формы с использованием компонентов и JSON-структурыПрименение паттерна Фабричный Метод для создания объектов базы данныхСоздание повторно используемого шаблона Dao в Java с Hibernate и обобщениямиОрганизация кода для работы веб-приложения в зависимости от типа пользователяВнедрение клиентоориентированного метода в интерфейс слушателя: применение и оценка эффективностиНаследование без полиморфизма/переопределения - правильная практика?Научитесь создавать систему взаимосвязанных классов в C++ для обертки GLFWРазработка приложений для iOS: Unwind Segues - удобное, но сложное решение для навигации ( Разработка приложений для iOS: Unwind Segues - удобное, но сложное решение)Лучшие практики группировки классов с ассоциированными классами в PythonИспользование полиморфизма для групп доступа (Access Groups)Предотвращение избыточных условий проверки групп доступаПример организации кода