Java中状态机

状态机介绍

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

特点:

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

使用场景:

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

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

状态机实现

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

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

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

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

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

具体的状态流转是:

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

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

使用表格表示:

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

具体代码实现:

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

    private String name;

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

    public String getName() {
        return name;
    }
}
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;
    }
}
/**
 * 状态机
 */
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;
    }
}

测试代码:

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));
    }
}

测试结果:

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)
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java Spring状态机是一个框架,用于在Spring应用程序使用状态机概念。它提供了易于使用的扁平单级状态机和分层状态机结构,以简化复杂的状态配置。它还提供了状态机区域,用于更复杂的状态配置,并使用触发器、转换、警卫和操作。此外,它还提供了键入安全配置适配器、生成器模式、基于Zookeeper的分布式状态机状态机事件监听器、UML Eclipse Papyrus建模和将计算机配置存储在永久存储。Spring IOC集成将bean与状态机关联起来。 以下是一个简单的Java Spring状态机示例: ```java @Configuration @EnableStateMachine public class SimpleStateMachineConfig extends StateMachineConfigurerAdapter<String, String> { @Override public void configure(StateMachineStateConfigurer<String, String> states) throws Exception { states .withStates() .initial("SI") .state("S1") .state("S2") .end("SF"); } @Override public void configure(StateMachineTransitionConfigurer<String, String> transitions) throws Exception { transitions .withExternal() .source("SI").target("S1").event("E1") .and() .withExternal() .source("S1").target("S2").event("E2") .and() .withExternal() .source("S2").target("SF").event("E3"); } } ``` 此配置定义了一个简单的状态机,其包含三个状态:SI、S1和S2,以及一个结束状态SF。状态机从SI开始,然后根据事件E1转换到S1,然后根据事件E2转换到S2,最后根据事件E3转换到SF。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值