Что такое Государственная машина?
Википедия определяет конечный автомат (FSM) как:
абстрактная машина, которая может находиться ровно в одном из конечного числа состояний в любой момент времени. FSM может переходить из одного состояния в другое в ответ на некоторые внешние входы; переход из одного состояния в другое называется переходом. FSM определяется списком его состояний, его начальным состоянием и условиями для каждого перехода.
Это способ запрограммировать модель так, чтобы она находилась в одном определенном состоянии в любой момент.
Мир наполнен государственными машинами, которые мы можем видеть в любом месте нашего повседневного использования. Ниже приведены несколько
- Сигналы дорожного движения Красный -> Желтый -> Зеленый
- Автомат по продаже Кофе
- Заказ на портале электронной коммерции
- Онлайн-Бронирование Поездок
- Много Заданий Cron
Реализация Государственных Машин На Java
Есть много способов, которыми мы можем реализовать государственные машины. В самом мире Java у нас есть множество библиотек, с помощью которых мы можем моделировать эти состояния
Мы также можем реализовать их с помощью стандартного Шаблона проектирования состояния
[пример] https://www.journaldev.com/1751/state-design-pattern-java )
Что делать, если мы не хотим добавлять никаких внешних зависимостей? Что, если мы хотим иметь простую государственную машину и управлять ею с помощью нашей собственной логики?
Государственные машины, использующие перечисления в Java
Многие из нас воспользовались бы Uber или Ola хотя бы один раз. Давайте попробуем реализовать государственную машину бронирования поездок с помощью перечислений Java
Каковы идеальные состояния при бронировании поездки?
- Забронированная Поездка
- Назначенный водитель
- Водитель Достиг
- Поездка Началась
- Поездка Закончилась
Простая Реализация
public enum TripStates { TRIPCREATED, DRIVERASSSIGNED, DRIVERREACHED, TRIPSTARTED, TRIPENDED; }
Приведенное выше перечисление может быть использовано в нашем приложении для поддержания состояния поездки. Даже в базе данных это можно использовать, используя строковое значение перечисления. Пример Заявляет Трипп.ТРИПП CREATED.name ()
Теперь мы внедрили государственную машину, но как обеспечить надлежащий переход в состояние? Один простой способ – включить функцию в перечисление и проверять ее всякий раз, когда мы пытаемся изменить состояние поездки
public boolean canChangeTripState(TripStates fromState, TripStates toState){ return fromState.ordinal()
Вышеуказанную функцию необходимо вызывать всякий раз, когда необходимо изменить состояние. Это помогает в продвижении состояний вперед. Но с этим есть проблема. Мы сможем переместить поездку из созданной поездки в начатую. Описанная выше реализация может не решить реальное ограничение, которое мы хотели бы ввести, например, поездка не может быть помечена как начатая без отметки как достигнутая.
Как мы можем достичь этого с помощью простого перечисления?
Перечисления Java могут содержать дополнительные поля. Мы можем использовать это для решения этой проблемы.
public enum TripStates { TRIPCREATED(Arrays.asList(new TripStates[]{})), DRIVERASSSIGNED(Arrays.asList(new TripStates[]{TripStates.TRIPCREATED})), DRIVERREACHED(Arrays.asList(new TripStates[]{TripStates.DRIVERASSSIGNED})), TRIPSTARTED(Arrays.asList(new TripStates[]{TripStates.DRIVERREACHED})), TRIPENDED(Arrays.asList(new TripStates[]{TripStates.TRIPSTARTED})); private ListvalidFromStates = new LinkedList (); TripStates(List validFromStates) { this.validFromStates = validFromStates; } public boolean canChangeTripState(TripStates fromState, TripStates toState) { return toState.validFromStates.contains(fromState); } }
Если вы посмотрите, мы сохраняем действительный из штатов
, чтобы легко распространить это на другие случаи, когда поездка может закончиться даже из разных штатов. Пример: Клиент Недоступен и т.д..
Выше приведена простая реализация, которую можно использовать. Но если бы мы хотели иметь больше логики в этих переходах состояний, мы все еще могли бы использовать ее, но нам нужно связать вышеприведенную модель с другими шаблонами проектирования.
Оригинал: “https://dev.to/balaaagi/simple-state-machines-in-java-3mdo”