一个状态模式的小改进
2023-03-14 22:31:12 时间
设计模式中的状态模式实现太过”重”,而且状态流转的描述在代码上也不会是一目了然.所以我对状态模式进行了简化和优化.使其很”轻”,易于使用和实现,而且对于状态流转在代码上也能一目了然.所有的流转逻辑都能在一屏上显示出来.
State:首先就是状态 Event:事件,事件的触发使State状态发生改变
Next:实为路径,就是描述一个状态 触发某个事件后会变成具体其他状态的描述 Status:状态实例,State只是状态的描述,而Status就状态的实例,可以被执行根据State的描述来转换成新的State
代码可以见 https://github.com/zephyrleaves/easy-state
我们来看一个例子就能知道他是怎么用的了
首先我们先定义Event事件.
1
2 3 4 5 6 7 8 9 10 |
|
然后我们再定义状态
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
例如INIT上的@Next 表示当前如果发生DO这个Event,那么当前状态就是跳转到END上
最后看一下串联起来的执行结果
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
public class StatusTest {@org.testng.annotations.BeforeTest
public void setUp() { } @Test public void testConstuructor() { Status status = new Status(OrderState.INIT); //初始化状态为INIT Assert.assertEquals(OrderState.valueOf(“INIT”), status.getCurrentState()); } @Test public void testHappen() { Status status = new Status(OrderState.INIT); //初始化状态为INIT Assert.assertEquals(OrderState.INIT, status.getCurrentState()); HappenedResult result = status.happen(OrderEvent.DO); //当前状态出发了DO事件 Assert.assertEquals(result, HappenedResult.SUCCESS); //跳转成功 Assert.assertTrue(result.isSuccess()); Assert.assertEquals(status.getCurrentState(), OrderState.END); //当前状态已经跳转为END Assert.assertEquals(status.getPreviousState(), OrderState.INIT); //上一个状态为INIT HappenedResult result1 = status.happen(null); //没有发生事件 Assert.assertEquals(result1, HappenedResult.NO_EVENT); //提示你没事件发生 Assert.assertEquals(status.getCurrentState(), OrderState.END); //当前状态还是END Assert.assertEquals(status.getPreviousState(), OrderState.INIT); //上一个状态还是INIT HappenedResult result2 = status.happen(OrderEvent.DONE); //在当前状态发了DONE事件 Assert.assertEquals(result2, HappenedResult.NO_NEXT); //这个状态下没有定义会触发DONE事件 Assert.assertEquals(status.getCurrentState(), OrderState.END); //当前状态还是END Assert.assertEquals(status.getPreviousState(), OrderState.INIT); //上一个状态还是INIT Status status1 = new Status(OrderState.TEST); //初始化状态为TEST HappenedResult result3 = status1.happen(OrderEvent.DO); //在当前状态发了DO事件 Assert.assertEquals(result3, HappenedResult.NO_ARC); //这个状态下没有定义会触发的事件 Assert.assertEquals(status1.getCurrentState(), OrderState.TEST); //当前状态还是TEST Assert.assertEquals(status1.getPreviousState(), null);//没有上一个状态 } } |
相关文章
- NLP与知识图谱的对接
- 助你所在团队走上大数据路途的六大规则
- Uber开源数据可视化工具deck.gl获重大升级
- Spark程序运行常见错误解决方法以及优化
- 创业公司做数据分析(四)ELK日志系统
- 智能数据湖势在必行
- 监测和管理:现代数据中心的主要考虑因素
- 手机基站定位数据可视分析
- 启动大数据项目之前需要问的5个问题
- 玩不转大数据就别勉强了,或许“小数据”才是真正的终南捷径
- 首届中国国际大数据产业博览会将于5月26日在筑开幕
- 秒拍邓铮:如何做到面对二十亿视频播放请求而不慌
- 关于数据治理,你需要知道些什么?
- 批发行业转型,你需要搞定啥?
- 从底层到应用,那些数据人的必备技能
- 强势解析eBay BASE模式、去哪儿及蘑菇街分布式架构
- Hadoop1.0和Hadoop2.0的区别
- 智能数据湖势在必行
- SAP 助力医疗器械中小企业营业增收30%
- 基础算法学习路线及随想