content_views"
class="htmledit_views">
有限状态自动机的实现方式
1、使用swit
ch/
case模式
c;每个
case表示一个状态
c;而在
case的处理里面进行状态转换。
如:
swit
ch(state)
{
ce:pre">case LOCKED:
ce:pre">swit
ch(event)
ce:pre">{
ce:pre">case COIN:
ce:pre">state = UNLOCK;
ce:pre">dounlo
cked event...
ce:pre">break;
ce:pre">case PASS:
ce:pre">....
ce:pre">}
ce:pre">case UNLOCK:
ce:pre">....
}
这种方式
c;
优点:
效率比较快
缺点:
a:当状态很多的时候
c;维护起来非常麻烦
c;容易出错。
b:不容易定位错误
c;对于状态的理解也不清晰。
c:这段代码没有实现有限状态机和具体事件动作的隔离。
2、使用状态表实现
采用一处添加所有状态转化表
c;然后事件处理的时候遍历所有的表元素实现。如下:
publi
c Turntile(TurnstileController
class="tags" href="/tags/ACTION.html" title=a
ction>a
ction)
{
ce:pre"> turntileController =
class="tags" href="/tags/ACTION.html" title=a
ction>a
ction;
ce:pre"> addTranstion(LOCKED, COIN, UNLOCKED, unlo
ck());
ce:pre"> addTranstion(LOCKED, PASS, LOCKED, alarm());
ce:pre"> addTranstion(UNLOCKED, COIN, UNLOCKED, thankyou());
ce:pre"> addTranstion(UNLOCKED, PASS, LOCKED, lo
ck());
}
publi
c void event(int event)
{
ce:pre">for(int i=0; i<transition.size(); i++)
ce:pre">{
ce:pre">Transtion transtions = (Transtions)transtions.elementAt(i);
ce:pre">if (state= transtions.
currentState && event==transtions.event)
ce:pre">{
ce:pre">state = transtion.newState;
ce:pre">transtion.
class="tags" href="/tags/ACTION.html" title=a
ction>a
ction.exe
cute();
ce:pre">}
ce:pre">}
}
优点:
1、状态机可读性比较好
2、运行时修改状态表非常方便
3、维护起来简单
4、可以实现多个状态转换表
c;根据需要加载不同的转换表。
缺点:
1、效率有点低
c;因为需要遍历所有状态
2、需要写好多小的方法来实现动作。
3、采用状态模式。
针对每一种状态
c;产生一个状态类
c;而在状态类通过动作类对象的引用进行相应动作的托管。
另外
c;将所有状态转换表写在一个文件中
c;使用状态机
class="tags" href="/tags/BianYiQi.html" title=编译器>编译器将状态文件内的状态表转换成相应的
class="tags" href="/tags/JAVA.html" title=java>java或者
c++源代码。
优点:
1、效率快
2、状态维护方便
3、解耦了具体状态实现和状态机的代码。
缺点:
1、需要状态机编译软件。可以下载
c;也可以自己实现。不过应该比较复杂。
2、
具体见《
class="tags" href="/tags/MinJie.html" title=敏捷>敏捷软件开发:原则、模式与实践》P426
学到
class="tags" href="/tags/CeShi.html" title=测试>测试驱动开发、状态模式的应用