工作中一个简单的状态机实现,总结如下。
定义状态:
public enum Qstate{ ORDER(1), CANCEL(2); private int code; private Qstate(int code){ this.code = code; } public int getCode(){ return code; } } public enum Vstate{ INIT(1), ORDER(2), CHECKSTOCK(3), CANCEL_VENDOR(4), CANCEL_USER(5), OVER(6), STARTSERVICE(7); private int code; private Vstate(int code){ this.code = code; } public int getCode(){ return code; } } public enum State{ ORDER_INIT(Qstate.ORDER, Vstate.INIT), ORDER_ORDER(Qstate.ORDER, Vstate.ORDER), ORDER_CHECKSTOCK(Qstate.ORDER, Vstate.CHECKSTOCK), ORDER_STARTSERVICE(Qstate.ORDER, Vstate.STARTSERVICE), ORDER_OVER(Qstate.ORDER, Vstate.OVER), ORDER_VENDORCANCEL(Qstate.ORDER, Vstate.CANCEL_VENDOR), CANCEL_ORDER(Qstate.CANCEL, Vstate.ORDER), CANCEL_CHECKSTOCK(Qstate.CANCEL, Vstate.CHECKSTOCK), CANCEL_USERCANCEL(Qstate.CANCEL, Vstate.CANCEL_USER); private Qstate q; private Vstate v; private State(Qstate q, Vstate v){ this.q = q; this.v = v; } public int getCode(){ return (q.code * 100) + v.code; } public int getQCode() { return q.code; } public int getVCode() { return v.code; } }
定义事件:
public enum Event{ VORDER, VORDER_AUTOCHECKHAVE, VORDER_AUTOCHECKNO, TIMEOUT_NOPAY, TIMEOUT_NOCHECKSTOCK, USER_CANCEL_ORDER, V_CANCEL_ORDER, CHECKSTOCK_HAVE, CHECKSTOCK_NO, APPLY_PAY, GET_CAR, KEEP_ORDER, NOSHOW, RETURN_CAR; }
定义返回值:
public enum StateChgCode{ OK_STATE_CHG, //状态流转 OK_STATE_NO_CHG, //状态不流转 ERROR; //状态错误不能流转 } public class StateChgRet{ private StateChgCode code; private State newState; public StateChgRet(StateChgCode code, State newState){ this.code = code; this.newState = newState; } public StateChgCode getCode(){ return code; } public State getNewState() { return newState; } @Override public String toString(){ return String.valueOf(code) + "---" + String.valueOf(newState) + "---" + newState.getCode(); } }
获取当前状态:
public State getState(int qState, int vState){ if (1 == qState){ switch (vState){ case 1: return State.ORDER_INIT; case 2: return State.ORDER_ORDER; case 3: return State.ORDER_CHECKSTOCK; case 4: return State.ORDER_VENDORCANCEL; case 6: return State.ORDER_OVER; case 7: return State.ORDER_STARTSERVICE; case 5: default: throw new IllegalStateException("invalid vState:" + vState); } }else if (2 == qState){ switch (vState){ case 2: return State.CANCEL_ORDER; case 3: return State.CANCEL_CHECKSTOCK; case 5: return State.CANCEL_USERCANCEL; case 1: case 4: case 6: case 7: default: throw new IllegalStateException("invalid vState:" + vState); } } throw new IllegalStateException("invalid qState:" + qState); }
状态变更(当前状态+事件):
public StateChgRet stateChg(State curState, Event event){ if (null != curState && null != event){ StateChgRet ret = null; switch(event){ case VORDER: ret = onVorder(curState); break; case TIMEOUT_NOPAY: ret = onTimeOutNoPay(curState); break; case TIMEOUT_NOCHECKSTOCK: ret = onTimeOutNoCheckStock(curState); break; case USER_CANCEL_ORDER: ret = onUserCancelOrder(curState); break; case V_CANCEL_ORDER: ret = onVendorCancelOrder(curState); break; case CHECKSTOCK_HAVE: ret = onCheckStockHave(curState); break; case CHECKSTOCK_NO: ret = onCheckStockNo(curState); break; case APPLY_PAY: ret = onApplyPay(curState); break; case KEEP_ORDER: ret = onKeepOrder(curState); break; //...太长省略一部分 default: throw new IllegalStateException("Illegal state:" + curState); } return ret; } throw new IllegalStateException("param error!"); }
触发操作方法,返回流转后的状态:
private StateChgRet onVorder(State curState){ switch(curState){ case ORDER_INIT: return baseMgr.new StateChgRet(StateChgCode.OK_STATE_CHG, State.ORDER_ORDER); //状态可流转,流转到State.ORDER_ORDER状态 case ORDER_ORDER: case ORDER_CHECKSTOCK: case ORDER_STARTSERVICE: case ORDER_OVER: case CANCEL_ORDER: case CANCEL_CHECKSTOCK: case ORDER_VENDORCANCEL: case CANCEL_USERCANCEL://状态不流转 return baseMgr.new StateChgRet(StateChgCode.ERROR, null); default: throw new IllegalStateException("Illegal state:" + curState); } } //...
操作方法不一一列出,其它方法与onVendor()方法类似。
这个状态机通过当前状态currentState及对应的事件Event,获取状态返回值StateChgRet,StateChgRet类中包含了状态是否可以流转,以及流转后的状态是什么。
但本状态机与设计模式中的状态模式其实关系不大,因为只是通过switch-case语句进行判断而已(与if-else其实一样)。
设计模式中的状态模式定义:把不同状态的操作分散到不同的状态对象中去完成。
见我的另一篇blog:设计模式回顾之七:状态模式(State)
相关推荐
总结来说,"简单状态机控制步进电机"项目是一个实现步进电机精确控制的实例,它利用状态机模型简化了控制逻辑,便于理解和实施。通过这个项目,你可以学习到状态机的设计、步进电机的工作原理以及如何在实际应用中...
状态机在计算机科学和电子工程领域,特别是在FPGA(Field-Programmable Gate Array)设计中,是一个核心概念。FPGA是一种可编程的硬件设备,能够根据开发者的需求配置成各种逻辑电路,包括复杂的状态机系统。本文将...
总结来说,这个项目涉及到了使用Keil工具在8051单片机上设计和实现一个有限状态机,其中状态机采用列表形式存储,便于扩展,同时附带了电路图来帮助理解硬件接口。这样的实现方法既适用于简单的控制逻辑,也能够适应...
一个状态机由一系列状态和转换规则组成。每个状态代表系统可能存在的一个特定条件,而转换规则定义了在特定条件下,系统如何从一个状态转移到另一个状态。例如,在TCP连接中,我们可以有以下几种状态:CLOSED、...
在软件工程中,有限状态机(Finite State Machine, FSM)是一个重要的概念,它用于建模系统的行为,通过一系列预定义的状态和转换来描述系统的动态过程。在Python中,有多种库可以帮助我们创建有限状态机,其中之一...
本资源“C语言嵌入式状态机架构(含C源码)”提供了一个关于如何在C语言环境中构建和应用状态机的详细指南。 首先,让我们深入理解状态机的概念。状态机是一种抽象的计算模型,它由一系列状态以及在这些状态之间...
总结来说,这个"最好的状态机源代码"可能是一个高效、灵活的状态机实现,适合游戏开发和其他需要处理多状态逻辑的场景。通过理解和应用这个框架,开发者可以更好地组织代码,提高代码的可读性和可维护性。
在NI-Tutorial-简单状态机.pdf中提到,这种状态机的实现方式被称为摩尔机,即下一个状态仅仅依赖于当前状态,而不是外部输入信号(与米利机相对)。通过这种方式,状态机可以轻松地调整各个状态及其执行顺序,而无需...
在“状态机设计.pdf”文件中,可能会包含一个具体的VHDL状态机设计案例,比如一个简单的UART接收状态机。这个状态机可能有多个状态,如IDLE(空闲)、START(起始位检测)、DATA(数据接收)、PARITY(奇偶校验位...
总结来说,"基于状态机的简易RISC CPU设计"是一个综合性的学习项目,它涵盖了计算机体系结构、状态机设计、Verilog编程等多个重要知识点。通过实践,你不仅可以掌握RISC CPU的基本原理,还能提升你的硬件设计能力,...
对于单片机程序设计而言,状态机的应用更为广泛,比如一个简单的按键命令解析程序,其工作过程就可以被视为一个状态机:从初始状态开始,根据不同的按键输入,系统会在不同的状态之间切换。 #### 二、状态机的关键...
有限状态机(Finite State Machine, FSM)是一种数学模型,用于描述一个系统随时间可能经历的各种状态以及状态之间的转换。在Python中,`transitions`库提供了对这种模型的抽象,简化了状态管理和转换的实现。要安装...
状态机(State Machine)是一种广泛应用于计算机科学、电子工程等领域的抽象模型,用于描述一个系统的行为。状态机可以理解为一系列有限的状态集合,每个状态代表了系统在某个时间点的工作情况。系统在运行过程中会...
这个实战训练可能涉及到具体的项目,比如设计一个简单的通信协议控制器或者数据处理单元,通过实际的Verilog代码来实现和验证一个具体状态机模型。 总结来说,Verilog HDL提供了一种强大且灵活的方法来实现状态机...
2. 隐式状态机:使用函数指针或者枚举类型来表示状态,每个状态对应一个处理函数。这种实现方式更加灵活,但可能导致代码更难以理解和调试。 在实际应用中,有限状态机有以下优点: 1. 结构清晰:将复杂逻辑分解为...
状态机是由一系列状态和转换规则组成的,每个状态代表系统的一种行为模式,而转换则是从一个状态到另一个状态的条件。在Verilog中,状态机通常用寄存器来存储当前状态,并通过组合逻辑电路来决定下一个状态。 二、...
有限状态机通常由寄存器和组合逻辑电路构成,它们共同构成了一个时序电路,并接受一个公共的时钟信号。在状态机中,状态的改变只能发生在时钟跳变沿的时刻,而状态是否改变以及如何改变则取决于当前状态与输入信号。...