工作中一个简单的状态机实现,总结如下。
定义状态:
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)
相关推荐
对于一个状态机的运行而言,这样的节省当然微乎其微,但假如你的系统同时运行成千上万个这种状态机时,那么就有必要考虑一下这种优化了。 (2)查表法 第(1)种方法再怎么优化,也需要枚举状态和消息,...
对于客户机,EntityBean是一种持久性对象,它代表一个存储在持久性存储器中的实体的对象视图,或是一个由现有企业应用程序实现的实体。 Session Bean 还可以再细分为 Stateful Session Bean 与 Stateless Session ...
(1)、设计一个模拟拔河游戏比赛的逻辑电路。 (2)、电路使用7个(或9个)发光二极管,开机后只有在拔河绳子中间的发光二极管亮。 (3)、比赛双方各持一个按钮,快速不断地按动按钮,产生脉冲,谁按得快,发光的...
实验六 状态机实现的ADC0809采样控制电路………………P29 实验总结与感悟 …………………………………………………P36 实验一 7段数码显示译码器设计 一、实验目的 (1)学习使用Verilog HDL语言设计简单组合逻辑...
微内核结构由一个简单的硬件抽象层和一组比较关键的原语(仅仅为建立系统必须的部分,包括线程管理、地址空间和进程间通信)或系统调用组成。 微内核的目标将系统服务的实现和系统的基本操作规则分离开来
A SCII 码:用 7 位二进制数表示的或用一个字节表示,最高位为 0 这是事实上的国际规范。 汉字编码:用连续的两个字节表示,且规定最高位为 1 这是中国国家规范。 9. 存储容量和地址 存储容量是存储部件存储单元的...
本人利用差不多一个月的时间学习了windows网络编程,实现了主客户端发送文字消息、文件收发、主动断开连接、传输速率计算等功能。总结:大家做网络编程的时候要有全局观,像我这样想实习文字、文件的收发,在区分是...
执行装置可以很简单,如手机上的一个微小型的电机,当手机处于震动接收状态时打开;也可以很复杂,如SONY 智能机器狗,上面集成了多个微小型控制电机和多种传感器,从而可以执行各种复杂的动作和感受各种状态信息。
操作系统是配置在计算机硬件上的第一层软件,主要作用是管理好这些设备,提高利用率和系统的吞吐量,并为用户和应用程序提供一个简单的接口。 多道程序是指将多个进程同时加载到内存中,并通过切换执行的方式实现...
ALU通常有两个数据输入端A和B输出操作数,一个数据输出端Y以及 标志位输出结果,通过输入操作码op来确定所要进行的操作,本实验通过实现一个状态 机,根据状态机状态的变化来输人操作数及操作码,并最终实现不同的...
文件不大,内容很系统。从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 事务级...
► 第二部分”z/OS的应用程序编程”介绍了开发一个在z/OS上运行的简单程序 所用到的工具和实用程序。该部分将引导学生进行应用程序设计,选择编程 语言和使用一个运行时环境。 ► 第三部分”z/OS联机工作...
计算机中字符数据的表示方式 字符数据主要指西文的 A SCII 码和汉字,计算机内是用什么代码表示的 A SCII 码:用 7 位二进制数表示的或用一个字节表示,最高位为 0 这是事实上的国际规范。 汉字编码:用连续的...
本次设 计是设计一个简易计算器,能够进行多位简单的加减运算,同时它能支持2位整数运算。 它主要由STC89S52单片机、A8255、数码管,键盘等模块组成。本计算器是将键盘输入信 息经处理通过缓存,送入数码管显示,...
5.3 状态机设计实例 5.4 存储器设计实例 5.5 门禁系统设计实例 第6章 FPGA的配置与编程 6.1 Altera FPGA配置与编程 6.2 Xillinx FPGA配置 第7章 FPGA的配置与编程 第8章 FPGA发展趋势 ...
完成到中级状态的要求,基本已经完成一个嵌入式蓝牙点菜系统了,但还有更多的东西可以在高级状态中进行考虑,同学们也可以选择一些,觉得比较容易实现的,去实现它们。 高级状态主要是要发挥同学们的主观能动性,...
它从MBT的概述开始,并且深入处理了九个不同的测试模型,其中有一章专门针对每个模型。这些章节通过一对例子相结合:简单的保险费计算和描述车库门控制器的事件驱动系统。该书显示了更简单的模型 – 流程图,决策表...
实例130: 一个简单的贪吃蛇游戏 498 实例131: 开发一个魔塔游戏 504 实例132: 疯狂足球游戏 524 第13章 Android程序优化 547 实例133: 测试计算机的性能 547 实例134: 测试内存性能 550 实例135: 优化...
如果简化成为这样一个状态,perCDM不但可以搜索代码,而且可以同时搜索输入的文档(甚至文档就写作在其中),我想可以首先从简单的模式去实现,这是一个我需要的模式。 3、文档模式,对apose进行了初步的分析。这个...