`

一个简单的状态机总结

阅读更多

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

定义状态:

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)

 

分享到:
评论

相关推荐

    嵌入式系统的微模块化程序设计-实用状态图C/C++实现

    对于一个状态机的运行而言,这样的节省当然微乎其微,但假如你的系统同时运行成千上万个这种状态机时,那么就有必要考虑一下这种优化了。  (2)查表法  第(1)种方法再怎么优化,也需要枚举状态和消息,...

    java 面试题 总结

    对于客户机,EntityBean是一种持久性对象,它代表一个存储在持久性存储器中的实体的对象视图,或是一个由现有企业应用程序实现的实体。 Session Bean 还可以再细分为 Stateful Session Bean 与 Stateless Session ...

    拔河游戏机-课程设计报告

    (1)、设计一个模拟拔河游戏比赛的逻辑电路。 (2)、电路使用7个(或9个)发光二极管,开机后只有在拔河绳子中间的发光二极管亮。 (3)、比赛双方各持一个按钮,快速不断地按动按钮,产生脉冲,谁按得快,发光的...

    合工大FPGA实验报告(译码器,加法器,投票表决器,巴克码信号发生器,数字钟,状态机实现的ADC0809采样控制电路)

    实验六 状态机实现的ADC0809采样控制电路………………P29 实验总结与感悟 …………………………………………………P36 实验一 7段数码显示译码器设计 一、实验目的 (1)学习使用Verilog HDL语言设计简单组合逻辑...

    系统架构师考试知识点总结

    微内核结构由一个简单的硬件抽象层和一组比较关键的原语(仅仅为建立系统必须的部分,包括线程管理、地址空间和进程间通信)或系统调用组成。 微内核的目标将系统服务的实现和系统的基本操作规则分离开来

    计算机应用基础知识总结大全精编.docx

    A SCII 码:用 7 位二进制数表示的或用一个字节表示,最高位为 0 这是事实上的国际规范。 汉字编码:用连续的两个字节表示,且规定最高位为 1 这是中国国家规范。 9. 存储容量和地址 存储容量是存储部件存储单元的...

    利用TCP实现主客机对话收发文件(可主动断开连接,发送文件过程中取消,发送速率)

    本人利用差不多一个月的时间学习了windows网络编程,实现了主客户端发送文字消息、文件收发、主动断开连接、传输速率计算等功能。总结:大家做网络编程的时候要有全局观,像我这样想实习文字、文件的收发,在区分是...

    嵌入式设计开发中的常见问题小总结

    执行装置可以很简单,如手机上的一个微小型的电机,当手机处于震动接收状态时打开;也可以很复杂,如SONY 智能机器狗,上面集成了多个微小型控制电机和多种传感器,从而可以执行各种复杂的动作和感受各种状态信息。

    操作系统重要概念复习总结

    操作系统是配置在计算机硬件上的第一层软件,主要作用是管理好这些设备,提高利用率和系统的吞吐量,并为用户和应用程序提供一个简单的接口。 多道程序是指将多个进程同时加载到内存中,并通过切换执行的方式实现...

    ALU实验报告.doc

    ALU通常有两个数据输入端A和B输出操作数,一个数据输出端Y以及 标志位输出结果,通过输入操作码op来确定所要进行的操作,本实验通过实现一个状态 机,根据状态机状态的变化来输人操作数及操作码,并最终实现不同的...

    OSPF总结--个人笔记

    文件不大,内容很系统。从ospf基础到高深。从单区域到多区域。系统介绍三张表五种包八种状态机以及各种lsa,简单系统。包含红客联盟09年cisco路由协议挑战100问。超强,超难度

    高级验证方法学

    6.1 一个简单的存储器设计 6.2 激励产生器 6.3 监视器 6.4 三类状态机 6.5 驱动器 6.6 总结 第7章 完整的验证平台 7.1 分析端口和分析组件 7.2 记分板 7.3 覆盖率 7.4 注入错误 7.5 总结 第8章 逐步优化 8.1 事务级...

    大型机ZOS基础

    ► 第二部分”z/OS的应用程序编程”介绍了开发一个在z/OS上运行的简单程序 所用到的工具和实用程序。该部分将引导学生进行应用程序设计,选择编程 语言和使用一个运行时环境。 ► 第三部分”z/OS联机工作...

    计算机应用基础知识总结大全(1).doc

    计算机中字符数据的表示方式 字符数据主要指西文的 A SCII 码和汉字,计算机内是用什么代码表示的 A SCII 码:用 7 位二进制数表示的或用一个字节表示,最高位为 0 这是事实上的国际规范。 汉字编码:用连续的...

    单片机课程设计报告—简易计算器1.doc.doc

    本次设 计是设计一个简易计算器,能够进行多位简单的加减运算,同时它能支持2位整数运算。 它主要由STC89S52单片机、A8255、数码管,键盘等模块组成。本计算器是将键盘输入信 息经处理通过缓存,送入数码管显示,...

    FPGA设计与应用教学课件.ppt

    5.3 状态机设计实例 5.4 存储器设计实例 5.5 门禁系统设计实例 第6章 FPGA的配置与编程 6.1 Altera FPGA配置与编程 6.2 Xillinx FPGA配置 第7章 FPGA的配置与编程 第8章 FPGA发展趋势 ...

    无线蓝牙点菜系统(代码文档齐全)

    完成到中级状态的要求,基本已经完成一个嵌入式蓝牙点菜系统了,但还有更多的东西可以在高级状态中进行考虑,同学们也可以选择一些,觉得比较容易实现的,去实现它们。 高级状态主要是要发挥同学们的主观能动性,...

    The Craft of Model-Based Testing

    它从MBT的概述开始,并且深入处理了九个不同的测试模型,其中有一章专门针对每个模型。这些章节通过一对例子相结合:简单的保险费计算和描述车库门控制器的事件驱动系统。该书显示了更简单的模型 – 流程图,决策表...

    android开发实例大全_王东华

    实例130: 一个简单的贪吃蛇游戏 498 实例131: 开发一个魔塔游戏 504 实例132: 疯狂足球游戏 524 第13章 Android程序优化 547 实例133: 测试计算机的性能 547 实例134: 测试内存性能 550 实例135: 优化...

    PerCM个人代码管理软件

    如果简化成为这样一个状态,perCDM不但可以搜索代码,而且可以同时搜索输入的文档(甚至文档就写作在其中),我想可以首先从简单的模式去实现,这是一个我需要的模式。 3、文档模式,对apose进行了初步的分析。这个...

Global site tag (gtag.js) - Google Analytics