UML状态图简介
UML状态图是用于建模的五种UML 图之一, 它定义了一个物体在其生命周期中的不同状态,这些状态会随着事件的发生而改变。
UML状态图作用
UML状态图对于建立反应系统的模型很有用,UML状态图主要用于表现从一个状态到另一个状态的控制流。
UML状态图的作用,主要体现在如下4个方面:
1.为系统的动态方面建模,让系统的信息表述的更全面;
2. 描述一个物体在其有生之年的不同状态,是处于触发,还是休眠,或者是死亡;
3. 建立对象的生命周期模型,有利于程序员设计对象的方法等;
4.帮助程序员了解需求提高编码速度。
UML状态图组成
状态图通常包括如下内容:
1.State/状态状态是对象生命期间的条件,在此期间它满足某些条件,执行某些活动或等待某些外部事件2.Event/事件事件是重要事件的规范。 对于状态机制,事件是可以触发状态转换的刺激的发生。3.Transition/过渡
转换是两个状态之间的关系,指示当满足指定的一组事件和条件时,处于第一状态的对象将执行某些动作并进入第二状态。
4.Action
Action是可执行的,原子的(参考状态机)计算。Action可以包括操作,创建或销毁其他对象,或者将信号发送到其他对象(事件)。
UML状态图例子
我们的案例是电商平台的商品管理,商品管理本质上是内容管理,内容管理包括:文章管理、短视频管理、优惠券管理等,也包括我们上文提到的身份认证。
步骤一:绘制主干的状态
对于一个商品管理,我们先要考虑主干的状态,并忽略一些次要的状态。比如对于商品管理,其主干的状态如下图所示。
这个状态图很简单,和我们之前的身份认证的状态图很类似,我们只要略微调查,就非常容易梳理出来。
和身份认证状态图不同,这里多了一个保存成草稿状态,加入的原因是商家无法一次编辑完商品信息。商家可先编辑一点保存成草稿,就可留待以后再编辑。
但这个状态图的状态并不全,比如商品已被审核拒绝,商品已被删除等都没画。这些缺失的状态要在后面来完成。
步骤二:进行状态的拆合
状态是否存在都是要看业务,上一步我们拆分出了“草稿”状态就是基于业务的需求。这一步,我们要基于业务进一步完善状态图,此时我们可以从上到下看状态并思考:
用两词表述的状态,是要拆分还是合并。
我们前面说了,一个状态可用两个词表述。当用两词描述完了后,就要思考这个状态是要拆分,还是维持原状态。
比如,一个商品有“已提交、待审核”状态,可不可以拆成“已提交”和“待审核”两个状态?显然没有必要,商家已经提交了信息,自然是要让平台立即审核的,也就是“待审核”,没有必要拆成两个状态。
但是一个商品在“已通过,已上架”状态,就可以考虑拆成“已通过”和“已上架”两个状态。如一个团购平台,其商品多数是定时上架的,比如是半夜12点上架。这个时候,一个团购的商品即使审核通过了,也不能在前台显示,而要到了半夜12点再上架。
因此要拆分出“已通过”和“已上架”这两个状态。这两个状态也可以换个表述,分别为“已通过,待上架”和“已上架,正销售”,如图所示。
而再进一步,“已上架,正销售”是否要拆成两个状态呢?仍然可能有必要。因为一些团购的商品,只是显示在前台,但未到售卖时间,还是不能进行销售的,也就是处于“已上架,待销售”状态。只有到了开团时间,该商品才会变为“已上架,正销售”状态。
虽然“已上架,正销售”状态可以拆分成“已上架,待销售”和“已上架,正销售”两个状态。但是为了说明主要问题,我们认为该业务只有“已上架、正销售”状态,并不需要拆出新的状态了。
步骤三:完善分支的状态
主干状态梳理完毕后,需要梳理分支状态。分支状态的寻找,可通过找和主状态相反的状态来获得,比如:
- 既然审核有“已通过”状态,就要有“已拒绝”状态。
- 既然商品有“已上架”状态,就要有“已下架”状态,而下架的原因又包括:商家自己主动下架和商品卖光自动下架,即有“下架”和“卖光”状态。
- 既然商家可以创建一个商品,那么就可以删除一个商品,即商品有一个“删除”状态。
基于以上几种情况,我们可以抽象出新的状态,包括:已拒绝、已下架、已卖光和已删除。加入这几个状态的状态图如下图所示。
步骤四:完善角色和操作
上面我们把状态都列全了,下面就要考虑状态之间的转移。一个状态有可能转移到任何一个状态,包括转移回自己。而触发状态的转移可以是任何角色,这个角色可以是商家、审核人和系统等。所以这一步的思考的原则是:
不同的角色能否将当前状态,转移到其他状态和自身。
下面我们就按照这个原则进行思考,我们要分别从商家、审核人和系统这三个角色出发进行思考。
比如:商家的操作
按照上面的原则,我们可以完善商家的所有操作,如下图所示。为了便于阅读,所有新增加的操作,都用粗字并加下划线标记。
陈睿mikechen
10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》