文章目录
- 1.概述
- 2. 状态图的使用
- 2.1.状态图中的元素
- 2.2.状态图的使用案例
- 2.3.组合状态及其使用案例
- 3.总结
1.概述
状态图,又称为状态机图,是一种用于描述对象的生命周期和状态转换的UML图示,它是一种行为图,用于描述对象的状态和状态之间的转换。这里的对象大多数情况是指的类生成的对象,但是有时候也会代表对象、参与者、用例、子系统等。
通过状态图可以建立对象状态流转的统一语言,从而让项目成员可以通过更简单、更直观的理解系统的行为和交互(可以想象一下不使用状态图时,通过一大堆的文字对状态的变化进行描述,沟通会变得困难,而且还容易导致各成员对状态的理解不一致),同时,清晰的状态图有利于研发人员更好的设计和实现系统功能。
状态图通常会和活动图、时序图结合使用,以不同的视角来对这两种图示中对象状态流转的内容进行补充。
2. 状态图的使用
对于有一定开发经验的同学来说,状态图真的是非常简单的一种图例,它的画法与我们在日常开发中的思考方式是高度重合的,所以基本上一看到一个状态图,马上就可以理解它想表达的含义。
2.1.状态图中的元素
状态图中最常用的元素有4个,分别是:
- 开始:状态开始标记,用实心圆形表示。
- 结束:状态结束标记,用一个空心圆形中间嵌入一个实心原型表示。
- 状态:对象在某个时间上的状态,用圆角矩形表示。
- 转移:导致状态发生变化的事件,用实线箭线表示,箭头指向变化后的状态,在实线上用文字表示事件。
下图中分别表示有结束状态和没有结束状态的两种简单状态图:
2.2.状态图的使用案例
以一个CRM的实际流程为例:抽象一个线索对象,通过不同的事件触发线索的状态变化:
- 录入/导入线索:此时线索为待分配状态
- 分配线索:线索状态为已分配且处于待跟进状态
- 跟进线索:跟进过程中都属于跟进中状态
- 线索无效/线索转化:线索的生命周期结束,处于跟进结束状态
将上述的文字转换成状态图,如下图所示。
2.3.组合状态及其使用案例
组合状态是状态图中的一种特殊状态,它是由多个简单状态和转换嵌套组成的复合状态,描述的是对象的更复杂的状态和行为。在状态图中,符合状态表示的一个大的圆角矩形框里面包含了多个小的圆角矩形框,模型如下图所示:
使用案例:
在Java的并发编程中有一个线程的状态转换机制,这就是一个非常经典的状态模型,里面几乎包含了状态图中所有常用的元素(包括符合状态)。
在Java中有6种,分别是NEW , RUNNABLE , WAITING , TIMED_WAITING , BLOCKED , TERMINATED
,定义在Thread.class
中,其代码如下:
public enum State {
/**
* 线程已创建但未启动。
*/
NEW,
/**
* 线程已在虚拟机中启动,等待操作系统调度后就可以运行。
*/
RUNNABLE,
/**
* 等待监视器锁,也就是等待进入synchronized块。
*/
BLOCKED,
/**
* 线程阻塞,等待其它线程将它唤醒,等待的方法包括Object.wait(),LockSupport.park()Thread.join()
* 另外一个线程唤醒它需要使用对应的唤醒方法,Object.notify()或Object.notifyAll(),LockSupport.unPark()
* Thread.join()会阻塞到执行join方法的线程运行结束后,才唤醒当前线程。
*/
WAITING,
/**
* 与WAITING类似,只是在Waiting的几个方法中传入等待时间的参数,没有显示的唤醒情况下,运行时间超出设置的等待时间也会唤醒。
* 此外还有Thread.sleep(long);
*/
TIMED_WAITING,
/**
* 线程执行完毕后的状态
*/
TERMINATED;
}
其中的RUNNABLE
状态表示的是线程就绪可运行,但是线程实际是否运行,还需要操作系统为其分配CPU的时间片,所以又进一步将RUNNABLE划分成了就绪态和运行态,如下图所示:
3.总结
总的来说,状态图可以作为我们日常开发中处理对象的周期以及状态流转的指导,相对于其他的行为型uml图例(活动图,时序图)而言,状态图是比较简单的,可以作为前两种图例在状态这个视角上的补充。
我们在画状态图时,只需要记住4种不同的元素的含义及使用方法即可。