相信不少java开发者写过状态变更的业务,比如订单流程、请假流程等等。一般会搞一个状态标识来标识生命周期的某个阶段。很多人会写这种逻辑:
如果流程几十个岂不是要if到爆炸。还有这“0”、“1”是几个意思?
优化的办法当然可以使用设计模式中的状态模式来搞,允许一个具有状态的对象根据其状态封装同一对象的不同行为。我们可以编程状态之间的转换,然后定义单独的状态:
但是这种操作会增加过多的状态对象依赖。那么有没骚操作呢?当然有。我们先来了解了解状态机。
状态机全称有限状态机,因为一般的状态机的状态都是离散而且可枚举的,这就是有限的原因。状态机表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。通俗的描述状态机就是定义了一套状态変更的流程:状态机包含一个状态集合,定义当状态机处于某一个状态的时候它所能接收的事件以及可执行的行为,执行完成后,状态机所处的状态变化可以被感知。一般包含以下几个概念:
上图就是个变更的过程示意。接下来该说另一个东西java枚举了。
一个Java的枚举是一种定义的一类常量列表的特殊类型的类。是JDK 1.5中引入的新特性。 枚举在JDK中其实就是被设计成了单例模式,所以是不允许外部对其进行实例化的,枚举类型的实例化都是在其加载的时候JVM帮我们完成的。这是Java虚拟机规范明确规定的,保证了线程的安全性。由于Java枚举隐式实现了枚举超类java.lang.Enum,因此无法实现另一个类,但是可以实现接口。可以声明抽象方法由具体的内部枚举来实现。我们定义一个颜色枚举来看看:
我们可以通过 Colorful.RED.colorName() 直接拿到颜色的名称,非常方便而且语义化。
接下来我们将结合实际开发场景来实现一个简单枚举类型的状态机来处理业务。
订单派送到收货这个场景,我们考虑如下单纯的场景:
经历调度到派送最后到收货这个简单过程,我们可以定义如下状态枚举:
因为调度是初始状态,所以其prevState方法指向自己,因为收货时终止状态所以其nextState指向自己。通过定义这两个指针来进行操作所需要的流程。当然实际生产要结合你自己的业务来做。
然后我们订单流程就可以这样搞(省略getter和setter):
我们来简单测试一下:
经过两次的流转,货物成功到达买家的手中,状态也正确的进行了变更,而且可维护性也得到了保证,只需要变更枚举流程。好了今天就到这里,希望大家多多关注。
原创作者:码农小胖哥
转载地址:https://gper.club/articles/7e7e7f7ff7g58gc3g69
来源:https://gper.club/articles/7e7e7f7ff7g58gc3g69
详情请见原帖:https://blog.csdn.net/qq_43250944/article/details/88938359 打开apache-tomcat-9.0.17\conf\logging.properties编辑最后一个UTF-8为GBK 配置tomcat 添加VM options为:-Dfile.encoding=UTF-8...
上一篇关于Create.Js大家看了反映讲的太过简略,今天用尽所学再来一篇,“打得不好,请指教!” 第一步,先要看文档 Create.Js提供了一些显示类: 画图片用(Bitmap) 画图形,比如矩形,圆形等用(Shape) 画文字,用(Text) 还有容器Container的概念,容器可以包含多个显示对象,就像div标签一样,都有局部带动全局的功能。 …等 ...
(1)物理层—-定义了为建立、维护和拆除物理链路所需的机械的、电气的、 功能的和规程的特性,其作用是使原始的数据比特流能在物理媒体上传输。具 体涉及接插件的规格、“0”、“1”信号的电平表示、收发双方的协调等内容。 (2)数据链路层—-比特流被组织成数据链路协议数据单元(通常称为帧),并 以其为单位进行传输,帧中包含地址、控制...
这一节会记录人工智能的发展和主要分支 说起人工智能,脑海里一定会浮现出一个伟大的名字,对,就是图灵--人工智能之父。关于图灵的介绍,本文不做过多阐述,这里推荐看这个短视频:https://www.bilibili.com/video/BV1tx411V7yQ 。如果感兴趣,推荐看一部电影《模仿游戏》,你会对他的一生感到震撼和惋惜。 什么是人工智能...
通过EasyBCD引导硬盘安装。 参考 https://jingyan.baidu.com/article/e4d08ffdace06e0fd2f60d39.html 准备: 网上下载EasyBCD 最新版本,并安装。 下载 ubuntu-12.04-desktop-amd64.iso(64位系统)(或者ubuntu-12.04-desktop-i386.iso(32位系统)...
卡方检验 基本概念 卡方检验就是统计样本的实际观测值与理论推断值之间的偏离程度,实际观测值与理论推断值之间的偏离程度就决定卡方值的大小,卡方值越大,越不符合;卡方值越小,偏差越小,越趋于符合,若两个值完全相等时,卡方值就为0,表明理论值完全符合。 假设有两个分类变量XX和YY,其值域都是{x1,x2}{x1,x2},计算XX和YY之间的相关性需要先建立一个零假说。即两个变量之间不存在关系,理论频数...
画一块板子时,除了板子设计的合理性,稳定性之外,画板效率也是重要的 特别是当你设计deadline即将到来时,高效的画板效率更是迫切需要的 说了那么多,如何提高画板效率呢,快捷键是一个好方法,熟练地掌握快捷键有助于你快速完成PCB设计 以下是本人多年PCB设计总结出来的比较有用的快捷键(AD16) 一.原理图操作 1.翻转元器件:XY镜像翻转,空格旋转 2.修改原理图参数:D+O 3.标注所有器件...
走过路过,不要错过这个公众号哦! 0x01 文章简介 本文通过了解学习用Node.js构建HTTP服务器,学会使用Kali进行ARP欺骗,学会用Wireshark抓数据包,利用JavaScript实现HTTP的加密传输。 0x02 知识储备 1. 关于Node.js的一些基础知识 Node.js是一个基于Chrome JavaScript运行时建立的平台, 用于方便...
一、Hive整合HBase原理 Hive与HBase整合的实现是利用两者本身对外的API接口互相进行通信,相互通信主要是依靠hive-hbase-handler-0.9.0.jar工具类,如下图 Hive与HBase通信示意图 二、具体步骤 安装前说明 1、关于hadoop、HBase、Hive集群的搭建,请参考本人博文“基于Hadoop的数据分析综合管理平台之Hadoop、HBase...
1. 什么是flink? Flink 能够提供毫秒级别的延迟,同时保证了数据处理的低延迟、高吞吐和结果的正确性,还提供 了丰富的时间类型和窗口计算、Exactly-once 语义支持,另外还可以进行状态管理,并提供 了 CEP(复杂事件处理)的支持。 2. Flink 的重要特点? 事件驱动 事件驱动型应用是一类具有状态的应用,它从一个或多个事件流提取数据,并根据到来的事件触发计算、状态更新或其他...
I get refused access to my GitHub organisation's repos when trying to access the API using a personal token: (Python) Accessing a personal repo works. I have full access to my org's repos. What's the ...
Background Looking to disable highlighting a table's first column. HTML Source CSS Source Fiddle http://jsfiddle.net/2LQfg/1/ Problem When the user selects and drags the mouse button over the table, t...
What's the equivalent of int32_t in Visual C++? Visual C++ 2010 include <cstdint>, which includes typedef std::int32_t (you can also include <stdint.h> which has the same typedef in the gl...
I am creating an application that is aimed at dyslexic children and i need to be able to allow the user to change the background color of the screen for things like reading books etc. Currently the pa...
I have 3 functions. listener function calls check_url function in every 10 seconds. If this function success on checking, it calls destroy function. After destroy function done it's job, i want to ter...