Commons-SCXML 是一个状态机框架,
首先介绍状态机相关的术语。
1、状态机相关术语
1、1状态机
是一种行为,他说明对象在它的生命周期中响应事件所经历的状态序列以及对那些事件的响应。
1、2状态
是指对象的生命周期中的条件或者状况。在此期间对象将满足某些条件,执行某些活动或者等待某些事件。对象在一个状态下逗留有限的时间,一个状态内部包含这些如下内容
1、名称:取自所建模系统的词汇中的短名词或者名词短语
2、进入/退出效应:分别为静茹和退出该状态时候所执行的动作。(可选)
3、内部转移:不导致状态改变的转移
4、子状态:状态的嵌套结构,包括正交和非正交子状态
5、延迟事件:指在该状态下暂不处理,将推迟到该对象的另一个状态下排队处理的事件列表
6、初态和终态:一种为状态
1、3事件
是对一个在时间和空间上占有一定位置的有意义的发生的规约。在状态机语境中,一个事件是一个激励的发生,它能够触发一个状态转移
1、4转移
是两个状态之间的一种关系,他指明对象在第一个状态中执行一定的动作,并当特定事件发生或特定条件满足时候进入下一个状态。一个转移内部包含如下内容
1、源状态:转移所在的状态
2、事件触发器:是一个事件,源状态识别了这个事件,则在监护条件满足的情况下激活转移(可选)
3、监护条件:是一个Boolean表达式。(可选)
4、效应(动作):是一个可执行的行为(比如动作),他可以直接作用于拥有状态机的对象,并间接作用于该对象可见的其他对象。在线计算,操作调用,另一个对象的创建或者撤销,或者向一个对象发送消息。一个转移的效应和任何相关的进入和退出效应都必须执行完毕,才运行另外的时间引发新的转移。(可选)
5、目标状态:转移转到的状态。(SCXML标准里面可以没有目标状态,那么这个转移不会转出源状态,也不出触发源状态的进入和退出动作)(可选)
SCXML标准里面把效应(动作),统称为可执行内容。
2、编程思路:
- 先画出状态图(uml状态图):(这一步只是为了能直观的表现状态的变化,可以随便在纸上画或者使用EA,Rose等工具,)
- 编写状态图xml文件定义:根据画的状态图,编写对应的xml文件。
- 编写程序加载xml文件,编写界面,控制状态图的状态转移。
我们通过一系列的例子来讲学习SCXML标准和Commons-SCXML框架。
3、HelloWorld例子
3.1 画出状态图
本例比较简单就不画图了
3.2 编写状态图xml文件
<scxml xmlns="http://www.w3.org/2005/07/scxml"
version="1.0" inital="end">
<final id="end">
<onentry>
<log expr=" 'entry final state end ' " />
<log expr="'hello world'"/>
</onentry>
<onexit>
<log expr=" 'exit final state end ' " />
</onexit>
</final>
</scxml>
说明:如果你用的IDE在xmlns上面有报错,不用管它。
3.3 编程控制转移
package helloworld;
/**
* Created by zhengshouzi on 2015/11/19.
*/
import org.apache.commons.scxml2.SCXMLExecutor;
import org.apache.commons.scxml2.io.SCXMLReader;
import org.apache.commons.scxml2.model.SCXML;
import java.net.URL;
public class HelloWorld {
//通过加载HelloWorld类的类加载器加载helloworld.xml资源文件,得到URL
private static final URL HELLOWORLD = HelloWorld.class.getResource("helloworld.xml");
public static void main(String[] args) throws Exception {
//得到xml文件所对应的 SCXML对象
SCXML scxml = SCXMLReader.read(HELLOWORLD);
//实例化状态机引擎,
SCXMLExecutor executor = new SCXMLExecutor();
//将得到的SCXML对象,交给状态机引擎管理
executor.setStateMachine(scxml);
//然后引擎调用.go()方法启动状态机。
executor.go();
}
}
3.4 分析
上面的输出内容,和xml文件
log
标签里面定义的一样。
接下来准备再写一个 秒表和请假流程的例子,再把相关的标签和属性值约束给汉化了。