1. 状态结构图
2. 详细介绍
我们把状态机中的对象分为 “状态对象的持有者” 和 “状态对象”, 也就是Stateful 和 Status两类。AbstractStatus 抽象类实现 Status接口主要定义了一个模板transit,在状态转换前和状态转换后完成一些操作,并且增加了状态描述,方便记录当前所在的状态,比如log到db或者log到文件中。
StatusManager是由很多个全局单例的状态组成的,这些单例包含了所有StatusMachine中需要用到的状态,Stateful对象作为函数的参数传入到status的handleStatus方法中,这样避免了一个Status对象和Stateful绑定在一起,减少了Status对象的个数,这才可以把它们设计为单例。
3.功能函数介绍
Stateful; 状态对象的持有者,姑且就把它称为“有状态”对象,这个接口描述了“有状态”对象的行为, getCurrentStatus - 获取当前有状态对象的状态, setCurrentStatus: 改变当前有状态的对象所持有的状态, nextStatus:由StatusMachine调用改变“有状态”对象的状态。这个接口可以根据不同的应用添加不同的方法,因为状态对象持有者的行为根据不同应用可变性比较大。
Status: 状态对象,描述对象的状态,对象状态所具备的行为。getStatusDesc:得到状态的描述符, handleStatus: 处理当前状态, nextStatus:根据命令将“有状态”对象改变到下一个状态, transit:根据命令改变“有状态”对象的状态,并在改变前和改变后做一些特殊的操作,比如log, 判断是否是异常状态等。
AbstractStatus: 主要加入了描述字符串和异常状态,并且实现了transit方法,一般流程,如果有不同的transit流程,即需要在之前和之后完成不同的操作,可以在子类中重写transit方法。
StatusManager:定义了StatusMachine所需要的所有Status对象,这些对象都是全局静态单例的。
StatefulObject: Stateful对象的实现
StatusMachine: 主业务流程,主业务流程中需要操作一个或多个有状态对象的状态改变,调用“有状态”对象的nextStatus即可。
4. 简单实现
简单实例