今天看到boost有个库叫做statechart. 不禁兴趣较大,学习了一下,受益匪浅.
大体来说,这个库处理了大部分状态机uml中涉及到的点.
1. 简单状态处理
如上图,我们暂时认为acive是一个简单状态而不是一个复合状态. 那么按照状态机来说,有几个元素呢?
1) 初始状态
2) 转换事件/action
3) 中间状态
4) 结束状态 (暂无)
那么boost::statechart 重现过后,有如下对应对象
1) state_machine
2) simple_state / state
3) event
4) transition / reaction
我们来看看大致的代码对应:
1. 定义一个状态机对象
struct Machine : sc::state_machine{
Machine()
{
std::cout << __FUNCTION__ << std::endl;
}
~Machine()
{
std::cout << __FUNCTION__ << std::endl;
}
};
2. 定义初始状态对象
struct StatActive : sc::simple_state{
typedef sc::transitionreactions;
StatActive()
{
m_lElapsed = 0;
std::cout << __FUNCTION__ << std::endl;
}
~StatActive()
{
std::cout << __FUNCTION__ << std::endl;
}
};
3. 定义转化,注意第二步中已经贴出转换步骤代码,即typedef 部分
4. 启动状态机
Machine machine;
machine.initiate();
machine.process_event(EvReset());
machine.terminate();
就这样一个简单的状态机以及其相关的逻辑均已经体现.
下面我们来看一个复杂点的状态机,一个数码相机的例子;
先来分析一下这个状态机有哪些元素:
1. 有3个状态
1) notshooting (复合)
2) shooting (复合)
3) storing (基本)
所谓基本和复合大致的区别是符合状态内部还有小的状态机.
2. 有如下几种动作转换
1) HalfPress
a) 自动对焦模式
b) 手动对焦模式
2) FullPress