Java中状态机

状态机介绍

状态机(State Machine)是一种数学模型,用于描述对象或系统在不同状态之间的转移和行为。它由一组状态、转移条件和动作组成,可以根据输入条件从一个状态转移到另一个状态,并执行相应的动作。

特点:

  1. 离散性:状态机是离散的,它的状态和转移是离散的,不涉及连续变化。
  2. 易于理解和建模:状态机可以直观地描述对象或系统的行为,使得人们能够更好地理解和建模复杂的逻辑。
  3. 可扩展性:状态机可以轻松地添加新的状态和转移,以适应需求的变化。
  4. 灵活性:状态机可以根据输入条件自动转移状态,并执行相应的动作,具有较高的灵活性和自动化能力。

使用场景:

  1. 控制流程管理:状态机可以用于控制流程中的状态转移,例如工作流程管理、订单状态管理等。
  2. 设备控制:状态机可以用于描述设备的状态和状态转移,例如自动售货机、电梯控制等。
  3. 游戏开发:状态机可以用于游戏中的角色状态管理,例如角色的移动、攻击、防御等状态。
  4. 自动化系统:状态机可以用于自动化系统中的控制和决策,例如智能家居系统、工业自动化等。

总之,状态机是一种强大的工具,在一些较复杂的场景下可以帮助我们描述和管理对象或系统的状态和行为,提高代码的可理解性、可扩展性和灵活性。

状态机实现

一般情况下,都是使用状态模式:可以使用状态模式来实现状态机,将每个状态封装成一个类,通过状态之间的转换来实现状态机的功能,有点类似于策略模式。

状态机中一般包含状态(state)以及行为(handle),通过行为改变状态,并且此行为的结果是已知的。

案例:假设需要开发一套流程,其中,

状态:待处理、处理中、已处理、已评价。

行为:创建、分配、领取、流转、跟进、办结、评价。

具体的状态流转是:

行为 前置状态 后置状态
创建 待处理
分配 待处理 处理中
领取 待处理 处理中
流转 处理中 处理中
跟进 处理中 处理中
办结 处理中 已处理
评价 已处理 已评价

其实,从上面表格中也可以看出,行为和状态之间必然的联系,换成模型的话,可以用一个二维数组来表示,一维数组下标表示行为,二位数组下标表示前置状态,数组中的值表示后置状态。

使用表格表示:

创建 分配 领取 流转 跟进 办结 评价
待处理 × 处理中 处理中 × × × ×
处理中 × × × 处理中 处理中 已处理 ×
已处理 × × × × × × 已评价
已评价 × × × × × × ×

具体代码实现:

java 复制代码
public enum StatusEnum {
    PENDING("待处理"),
    PROCESSING("处理中"),
    PROCESSED("已处理"),
    EVALUATED("已评价");

    private String name;

    StatusEnum(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}
java 复制代码
public enum ActionEnum {

    CREATE("创建"),
    ASSIGN("分配"),
    RECEIVE("领取"),
    TRANSFER("流转"),
    FOLLOW_UP("跟进"),
    FINISH("办结"),
    EVALUATE("评价");

    private String name;

    ActionEnum(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}
java 复制代码
/**
 * 状态机
 */
public class StateMachine {

    private static final StatusEnum[][] transitions = {
            {null,StatusEnum.PROCESSING,StatusEnum.PROCESSING,null,null,null,null},
            {null,null,null,StatusEnum.PROCESSING,StatusEnum.PROCESSING,StatusEnum.PROCESSED,null},
            {null,null,null,null,null,null,StatusEnum.EVALUATED},
            {null,null,null,null,null,null,null}
    };

    public StatusEnum handle(StatusEnum status, ActionEnum action) {
        int statusIndex = status.ordinal();
        int actionIndex = action.ordinal();
        StatusEnum nextStatus = transitions[statusIndex][actionIndex];
        if (nextStatus == null) {
            throw new IllegalStateException("no valid action");
        }
        return nextStatus;
    }
}

测试代码:

java 复制代码
public class StateMachineTest {

    public static void main(String[] args) {
        StateMachine stateMachine = new StateMachine();
        // 当前状态待处理,操作是分配,得出下一步状态是处理中
        System.out.println(stateMachine.handle(StatusEnum.PENDING, ActionEnum.ASSIGN));

        // 当前状态已处理,操作是分配,为null,即操作不当
        System.out.println(stateMachine.handle(StatusEnum.PROCESSED, ActionEnum.ASSIGN));
    }
}

测试结果:

java 复制代码
PROCESSING
Exception in thread "main" java.lang.IllegalStateException: no valid action
	at com.honor.wpshowdemo.serverone.example.StateMachine.handle(StateMachine.java:17)
	at com.honor.wpshowdemo.serverone.example.StateMachineTest.main(StateMachineTest.java:11)
相关推荐
李崧正13 分钟前
Java技术分享:Lambda表达式与函数式编程
java·开发语言·python
老了,不知天命15 分钟前
鳶尾花項目JAVA
java·开发语言·机器学习
二哈赛车手21 分钟前
新人笔记---实现简易版的rag的bm25检索(利用ES),以及RAG上传时的ES与向量数据库双写
java·数据库·笔记·spring·elasticsearch·ai
winner888124 分钟前
从零吃透C++命名空间、std、#include、string、vector
java·开发语言·c++
AI人工智能+电脑小能手33 分钟前
【大白话说Java面试题】【Java基础篇】第26题:Java的抽象类和接口有哪些区别
java·开发语言·面试
bzmK1DTbd42 分钟前
SOLID原则在Java中的实践:单一职责与开闭原则
java·开发语言·开闭原则
winner88811 小时前
C++ 命名空间、虚函数、抽象类、protected 权限全套通俗易懂精讲(附与 Java 对比)
java·开发语言·c++
直奔標竿1 小时前
Java开发者AI转型第二十五课!Spring AI 个人知识库实战(四)——RAG来源追溯落地,拒绝AI幻觉
java·开发语言·人工智能·spring boot·后端·spring
qq_589568101 小时前
java基础学习,案例练习,即时通讯
java·开发语言·学习
逸Y 仙X2 小时前
文章十九: ElasticSearch Full Text 全文本查询
java·大数据·数据库·elasticsearch·搜索引擎·全文检索