`

一个简单的状态机总结

 
阅读更多

工作中一个简单的状态机实现,总结如下。

定义状态:

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_

    状态机在计算机科学和电子工程领域,特别是在FPGA(Field-Programmable Gate Array)设计中,是一个核心概念。FPGA是一种可编程的硬件设备,能够根据开发者的需求配置成各种逻辑电路,包括复杂的状态机系统。本文将...

    fsm_keil_version3_keil有限状态机_fsm打开_8051实现状态机_

    总结来说,这个项目涉及到了使用Keil工具在8051单片机上设计和实现一个有限状态机,其中状态机采用列表形式存储,便于扩展,同时附带了电路图来帮助理解硬件接口。这样的实现方法既适用于简单的控制逻辑,也能够适应...

    状态机的使用

    一个状态机由一系列状态和转换规则组成。每个状态代表系统可能存在的一个特定条件,而转换规则定义了在特定条件下,系统如何从一个状态转移到另一个状态。例如,在TCP连接中,我们可以有以下几种状态:CLOSED、...

    Python-一个轻量级面向对象的Python有限状态机实现

    在软件工程中,有限状态机(Finite State Machine, FSM)是一个重要的概念,它用于建模系统的行为,通过一系列预定义的状态和转换来描述系统的动态过程。在Python中,有多种库可以帮助我们创建有限状态机,其中之一...

    C语言嵌入式状态机架构(含C源码)

    本资源“C语言嵌入式状态机架构(含C源码)”提供了一个关于如何在C语言环境中构建和应用状态机的详细指南。 首先,让我们深入理解状态机的概念。状态机是一种抽象的计算模型,它由一系列状态以及在这些状态之间...

    最好的状态机源代码

    总结来说,这个"最好的状态机源代码"可能是一个高效、灵活的状态机实现,适合游戏开发和其他需要处理多状态逻辑的场景。通过理解和应用这个框架,开发者可以更好地组织代码,提高代码的可读性和可维护性。

    NI-Tutorial-简单状态机.pdf

    在NI-Tutorial-简单状态机.pdf中提到,这种状态机的实现方式被称为摩尔机,即下一个状态仅仅依赖于当前状态,而不是外部输入信号(与米利机相对)。通过这种方式,状态机可以轻松地调整各个状态及其执行顺序,而无需...

    VHDL状态机设计原理

    在“状态机设计.pdf”文件中,可能会包含一个具体的VHDL状态机设计案例,比如一个简单的UART接收状态机。这个状态机可能有多个状态,如IDLE(空闲)、START(起始位检测)、DATA(数据接收)、PARITY(奇偶校验位...

    基于状态机的简易RISC CPU设计

    总结来说,"基于状态机的简易RISC CPU设计"是一个综合性的学习项目,它涵盖了计算机体系结构、状态机设计、Verilog编程等多个重要知识点。通过实践,你不仅可以掌握RISC CPU的基本原理,还能提升你的硬件设计能力,...

    状态机思路在单片机程序设计中的应用

    对于单片机程序设计而言,状态机的应用更为广泛,比如一个简单的按键命令解析程序,其工作过程就可以被视为一个状态机:从初始状态开始,根据不同的按键输入,系统会在不同的状态之间切换。 #### 二、状态机的关键...

    Python有限状态机——transitions

    有限状态机(Finite State Machine, FSM)是一种数学模型,用于描述一个系统随时间可能经历的各种状态以及状态之间的转换。在Python中,`transitions`库提供了对这种模型的抽象,简化了状态管理和转换的实现。要安装...

    状态机1010编码

    状态机(State Machine)是一种广泛应用于计算机科学、电子工程等领域的抽象模型,用于描述一个系统的行为。状态机可以理解为一系列有限的状态集合,每个状态代表了系统在某个时间点的工作情况。系统在运行过程中会...

    VerilogHDL实现的状态机

    这个实战训练可能涉及到具体的项目,比如设计一个简单的通信协议控制器或者数据处理单元,通过实际的Verilog代码来实现和验证一个具体状态机模型。 总结来说,Verilog HDL提供了一种强大且灵活的方法来实现状态机...

    关于单片机编程的有限状态机的介绍

    2. 隐式状态机:使用函数指针或者枚举类型来表示状态,每个状态对应一个处理函数。这种实现方式更加灵活,但可能导致代码更难以理解和调试。 在实际应用中,有限状态机有以下优点: 1. 结构清晰:将复杂逻辑分解为...

    verilog 状态机

    状态机是由一系列状态和转换规则组成的,每个状态代表系统的一种行为模式,而转换则是从一个状态到另一个状态的条件。在Verilog中,状态机通常用寄存器来存储当前状态,并通过组合逻辑电路来决定下一个状态。 二、...

    有限状态机与Verilog设计.pdf

    有限状态机通常由寄存器和组合逻辑电路构成,它们共同构成了一个时序电路,并接受一个公共的时钟信号。在状态机中,状态的改变只能发生在时钟跳变沿的时刻,而状态是否改变以及如何改变则取决于当前状态与输入信号。...

Global site tag (gtag.js) - Google Analytics