状态模式学习笔记 --有限状态机的实现



有限状态自动机的实现方式
1、使用switch/case模式,每个case表示一个状态,而在case的处理里面进行状态转换。
如:
switch(state)
{
case LOCKED:
switch(event)
{
case COIN:
state = UNLOCK;
dounlocked event...
break;
case PASS:
....
}
case UNLOCK:
....
}


这种方式,
优点:
效率比较快


缺点:
a:当状态很多的时候,维护起来非常麻烦,容易出错。
b:不容易定位错误,对于状态的理解也不清晰。
c:这段代码没有实现有限状态机和具体事件动作的隔离。




2、使用状态表实现
采用一处添加所有状态转化表,然后事件处理的时候遍历所有的表元素实现。如下:
public Turntile(TurnstileController action)
{
  turntileController  = action;
  addTranstion(LOCKED, COIN, UNLOCKED, unlock());
  addTranstion(LOCKED, PASS, LOCKED,   alarm());
  addTranstion(UNLOCKED, COIN, UNLOCKED, thankyou());
  addTranstion(UNLOCKED, PASS, LOCKED, lock());
}




public void event(int event)
{
for(int i=0; i {
Transtion transtions = (Transtions)transtions.elementAt(i);
if (state= transtions.currentState && event==transtions.event)
{
state = transtion.newState;
transtion.action.execute();
}
}
}


优点:
1、状态机可读性比较好
2、运行时修改状态表非常方便
3、维护起来简单
4、可以实现多个状态转换表,根据需要加载不同的转换表。


缺点:
1、效率有点低,因为需要遍历所有状态
2、需要写好多小的方法来实现动作。




3、采用状态模式。
针对每一种状态,产生一个状态类,而在状态类通过动作类对象的引用进行相应动作的托管。
另外,将所有状态转换表写在一个文件中,使用状态机编译器将状态文件内的状态表转换成相应的java或者c++源代码。


优点:
1、效率快
2、状态维护方便
3、解耦了具体状态实现和状态机的代码。
缺点:
1、需要状态机编译软件。可以下载,也可以自己实现。不过应该比较复杂。
2、


具体见《敏捷软件开发:原则、模式与实践》P426


学到测试驱动开发、状态模式的应用



你可能感兴趣的:(其他杂项)