源码仅用于测试,请勿用于商用。源码来自网络,如有侵权,请联系我下架。
java枚举实现状态机来优雅你的状态变更逻辑

前言

相信不少java开发者写过状态变更的业务,比如订单流程、请假流程等等。一般会搞一个状态标识来标识生命周期的某个阶段。很多人会写这种逻辑:

81c16edb01abf9a6905287d6d7c1465f.png

如果流程几十个岂不是要if到爆炸。还有这“0”、“1”是几个意思?

优化的办法当然可以使用设计模式中的状态模式来搞,允许一个具有状态的对象根据其状态封装同一对象的不同行为。我们可以编程状态之间的转换,然后定义单独的状态:

3a7712fe25ea715da4cce999f7e08372.png

但是这种操作会增加过多的状态对象依赖。那么有没骚操作呢?当然有。我们先来了解了解状态机。

状态机

状态机全称有限状态机,因为一般的状态机的状态都是离散而且可枚举的,这就是有限的原因。状态机表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。通俗的描述状态机就是定义了一套状态変更的流程:状态机包含一个状态集合,定义当状态机处于某一个状态的时候它所能接收的事件以及可执行的行为,执行完成后,状态机所处的状态变化可以被感知。一般包含以下几个概念:

  • 状态 太废话了我,状态机没有状态还能叫状态机。
  • 事件 状态机的状态变更肯定是通过触发一个事件引起的。
  • 行为 触发了之后执行的业务逻辑。比如说订单未支付状态到支付状态的变更需要走的业务,写流水、修改账户余额等。
  • 变更 一个状态被一个事件触发执行了某些行为到达了另外一个状态的过程。

1786d6c5729de8738d2eeb8bb3fbbe49.png

上图就是个变更的过程示意。接下来该说另一个东西java枚举了。

Java中的枚举

一个Java的枚举是一种定义的一类常量列表的特殊类型的类。是JDK 1.5中引入的新特性。 枚举在JDK中其实就是被设计成了单例模式,所以是不允许外部对其进行实例化的,枚举类型的实例化都是在其加载的时候JVM帮我们完成的。这是Java虚拟机规范明确规定的,保证了线程的安全性。由于Java枚举隐式实现了枚举超类java.lang.Enum,因此无法实现另一个类,但是可以实现接口。可以声明抽象方法由具体的内部枚举来实现。我们定义一个颜色枚举来看看:

96946720c5e689dcefa9c25dc0501491.png

我们可以通过 Colorful.RED.colorName() 直接拿到颜色的名称,非常方便而且语义化。

接下来我们将结合实际开发场景来实现一个简单枚举类型的状态机来处理业务。

实战操作

订单派送到收货这个场景,我们考虑如下单纯的场景:
68f550216ebb615fe4a4d77b0d596054.png

经历调度到派送最后到收货这个简单过程,我们可以定义如下状态枚举:

91cfaad5231a51143a78e155d2c5c80c.png

因为调度是初始状态,所以其prevState方法指向自己,因为收货时终止状态所以其nextState指向自己。通过定义这两个指针来进行操作所需要的流程。当然实际生产要结合你自己的业务来做。

然后我们订单流程就可以这样搞(省略getter和setter):

91cfaad5231a51143a78e155d2c5c80c.png

我们来简单测试一下:

8da6c5308d0105cc45ad62a3f9e8d421.png

经过两次的流转,货物成功到达买家的手中,状态也正确的进行了变更,而且可维护性也得到了保证,只需要变更枚举流程。好了今天就到这里,希望大家多多关注。

阅读全文
资源下载
下载价格免费
使用用途仅限于测试、实验、研究为目的,禁止用于一切商业运营,本团队不承担使用者在使用过程中的任何违法行为负责所有源码请自测!不保证你源码完整性有效性所有源码都是全网搜集
原文链接:https://bcbccb.cn/3146.html,转载请注明出处。 免责声明:本资源并未取得原始权利人的授权,不可商用,仅可用于学习分析底层代码,CSS等,禁止用于商业行为。如因擅自商用引起的相关纠纷及法律责任,由使用人全部承担。支持正版,人人有责,请于下载后24小时内删除,谢谢支持!
1

评论0

最新盛大跑分系统源码多功能完美运营微信+支付宝+银行卡+云闪付+抢单系统跑分系统源码+完整数据
最新盛大跑分系统源码多功能完美运营微信+支付宝+银行卡+云闪付+抢单系统跑分系统源码+完整数据
1分钟前 有人购买 去瞅瞅看

站点公告

本站所提供的源码(主题/插件/应用源码)等资源仅供学习交流

禁止使用商业用途,否则产生的一切后果将由下载用户自行承担!

有部分资源为网上收集或仿制而来,若侵犯了您的合法权益,请来信通知我们.

目前会员大酬宾,终身会员现价299金币。近期调整价格

赶快加入,机会不等人! 立即参与

显示验证码
没有账号?注册  忘记密码?

社交账号快速登录

zh_CNChinese