【JAVA】状态机及简单应用

文章介绍了使用Java编写的两个状态机类(FSM和FSM2),展示了状态如何根据用户输入进行转换。它提到状态机在底层网络开发和项目菜单设计中常见,用于管理复杂的状态流转过程。
摘要由CSDN通过智能技术生成
import java.util.LinkedList;
enum State
{
    STATE1,
    STATE2,
    STATE3,
    STATE4
}

enum Input{
    INPUT1,
    INPUT2,
    INPUT3,
    INPUT4
}



class Record  {
    public State currentState;
    public Input input;
    public State nextState;
    public Record(State current_state, Input input, State next_state) {
        this.currentState = current_state;
        this.input = input;
        this.nextState = next_state;
    }
}

public class FSM
{
    public LinkedList<Record> fsms;
    State CurrentState;
    
    FSM()
    {
        fsms = new LinkedList<>();
        fsms.add(new Record(State.STATE1, Input.INPUT1, State.STATE2));
        fsms.add(new Record(State.STATE2, Input.INPUT2, State.STATE3));
        fsms.add(new Record(State.STATE3, Input.INPUT3, State.STATE4));

        CurrentState = State.STATE1;
    }

    public void computeNextState(Input input)
    {
        for (Record record: fsms)
        {
            if (CurrentState == record.currentState && record.input == input)
            {
                CurrentState = record.nextState;
                return;
            }
        }
    }
    
    public static void main(String[] args) {
        FSM fsm = new FSM();
        System.out.println(fsm.CurrentState);
        fsm.computeNextState(Input.INPUT1);
        System.out.println(fsm.CurrentState);
    }
}

在销售的时候,比如:

1、开始初始状态;

2、当前如果是初始状态,如果用户下单,当前状态就会转化为待付款状态;

3、当前如果是待付款状态,如果用户完成付款,当前状态就会转化为待发货状态;

4、当前如果是待付款状态,如果用户取消订单,当前状态就会转化为初始状态;

5、当前如果是待发货状态,如果仓库完成发货,当前状态就会转化为已发货状态;

当前状态输入下一个状态
初始状态用户下单待付款
待付款用户完成付款待发货状态
待付款用户取消付款初始状态
待发货仓库完成发货已发货状态
import java.util.LinkedList;
enum State2
{
    ChuShi,
    DaiFukuan,
    DaiFaHuo,
    YiFaHuo
}

enum Input2{
    YongHuXiaDan,
    YongHuWanChengFuKuan,
    YongHuQuXiaoFuKuan,
    CangKuWanChengFaHuo
}

class Record2  {
    public State2 currentState;
    public Input2 input;
    public State2 nextState;
    public Record2(State2 currentState, Input2 input, State2 nextState) {
        this.currentState = currentState;
        this.input = input;
        this.nextState = nextState;
    }
}

public class FSM2
{
    public LinkedList<Record2> fsms;
    State2 CurrentState;

    FSM2()
    {
        fsms = new LinkedList<>();
        fsms.add(new Record2(State2.ChuShi,    Input2.YongHuXiaDan,         State2.DaiFukuan));
        fsms.add(new Record2(State2.DaiFukuan, Input2.YongHuWanChengFuKuan, State2.DaiFaHuo));
        fsms.add(new Record2(State2.DaiFukuan, Input2.YongHuQuXiaoFuKuan,   State2.ChuShi));
        fsms.add(new Record2(State2.DaiFaHuo,  Input2.CangKuWanChengFaHuo,  State2.YiFaHuo));

        CurrentState = State2.ChuShi;
    }

    public void computeNextState(Input2 input)
    {
        for (Record2 record: fsms)
        {
            if (CurrentState == record.currentState && record.input == input)
            {
                System.out.println("当前状态: " + CurrentState + " 用户完成操作:" + input + " 新的状态: " + record.nextState);
                CurrentState = record.nextState;
                return;
            }
        }
    }

    public void resetCurrentState()
    {
        CurrentState = State2.ChuShi;
    }

    public static void main(String[] args) {
        FSM2 fsm = new FSM2();
        fsm.computeNextState(Input2.YongHuXiaDan);
        fsm.computeNextState(Input2.YongHuWanChengFuKuan);
        fsm.computeNextState(Input2.CangKuWanChengFaHuo);
        System.out.println();
        fsm.resetCurrentState();
        fsm.computeNextState(Input2.YongHuXiaDan);
        fsm.computeNextState(Input2.YongHuQuXiaoFuKuan);
    }
}

运行效果:

实际上,状态机在网络底层开发用的比较多,另外,比如在项目菜单开的状态也可以使用,比如主页面,根据不同的用户操作进入不同的子页面(不同的状态),再根据用户的不同输入,再进入下一个子页面,这样就形成了一系统状态转换表,这个例子是比较简单的,实际开发中的比较复杂,当然,说的不一定对。

  • 9
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是使用Java设计一个应用启动状态机的一种方式: 首先,我们可以定义一个枚举类型,用于表示应用启动过程中的不同状态,比如: ``` public enum AppState { INITIALIZING, CONFIGURING, STARTING, RUNNING, STOPPING, STOPPED } ``` 然后,我们可以定义一个状态机类,用于控制应用的状态转换。这个类可以包含一个当前状态变量,以及一系列方法,用于在不同的状态下执行不同的操作和状态转换,例如: ``` public class AppStateMachine { private AppState currentState = AppState.INITIALIZING; public void initialize() { if (currentState == AppState.INITIALIZING) { // 执行初始化操作 currentState = AppState.CONFIGURING; } } public void configure() { if (currentState == AppState.CONFIGURING) { // 执行配置操作 currentState = AppState.STARTING; } } public void start() { if (currentState == AppState.STARTING) { // 执行启动操作 currentState = AppState.RUNNING; } } public void stop() { if (currentState == AppState.RUNNING || currentState == AppState.STARTING) { // 执行停止操作 currentState = AppState.STOPPED; } } public AppState getCurrentState() { return currentState; } } ``` 在应用启动的过程中,我们可以创建一个AppStateMachine实例,并依次调用它的initialize()、configure()、start()和stop()方法,来控制应用的状态转换。例如: ``` public static void main(String[] args) { AppStateMachine stateMachine = new AppStateMachine(); stateMachine.initialize(); stateMachine.configure(); stateMachine.start(); // do something... stateMachine.stop(); } ``` 当调用完stop()方法后,应用就会处于已停止状态。在任何时候,我们可以通过调用stateMachine.getCurrentState()方法来获取当前的应用状态。 以上是一种简单Java应用启动状态机的设计方案,具体实现方式可以根据实际需求进行调整和完善。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值