状态机分两种:
(1) Moore状态机: 输出只和当前所处状态有关,而与输入的内容无关。
(2) Mealy状态机:输出与当前所处状态和输入的内容均有关。
状态机要求必须有终节点,当到达综态时,状态机停止。
有限状态机 = 状态 + 事件 + 转换 + 动作
例如RPG中的城门:
状态:Opened,Closed,Unlocked,Locked
事件:openDoor,closeDoor,lockDoor,unlockDoor
转换:两个状态之间的变换;
动作:可以执行的原子操作。
State.java
package hello;
public enum State {
OPENED,
CLOSED,
LOCKED,
UNLOCKED
}
Event.java
public enum Event {
open,
close,
lock,
unlock
}
FsmState.java
package hello;
/**
* 城门状态机
* @author henry
*
*/
public class FsmState {
/**
* 当前所处状态
*/
private State state;
public FsmState() {
this.state = State.OPENED;
}
public void enterOpened() {
System.out.println("enterOpened");
}
public void enterLocked() {
System.out.println("enterLocked");
}
public void enterUnlocked() {
System.out.println("enterUnlocked");
}
public void enterClosed() {
System.out.println("enterClosed");
}
/**
* 处理事件
* @param e
*/
public void processEvent(Event e) {
State oldState = state;
boolean pass = false;
switch (state) {
case CLOSED : {
if (e == Event.open) {
state = State.OPENED;
pass = true;
} else if (e == Event.lock) {
state = State.LOCKED;
pass = true;
}
} break;
case UNLOCKED : {
if (e == Event.lock) {
state = State.LOCKED;
pass = true;
} else if (e == Event.open){
state = State.OPENED;
pass = true;
}
} break;
case LOCKED : {
if (e == Event.unlock) {
state = State.UNLOCKED;
pass = true;
}
} break;
case OPENED : {
if (e == Event.close) {
state = State.CLOSED;
pass = true;
}
} break;
default : break;
}
if (oldState == state && !pass) {
return;
}
switch (state) {
case CLOSED : {
enterClosed();
} break;
case UNLOCKED : {
enterUnlocked();
} break;
case LOCKED : {
enterLocked();
} break;
case OPENED : {
enterOpened();
} break;
default : break;
}
}
}
Test.java
package hello;
public class Test {
public static void main(String[] args) {
FsmState doorState = new FsmState();
doorState.processEvent(Event.close);
doorState.processEvent(Event.lock);
doorState.processEvent(Event.unlock);
doorState.processEvent(Event.open);
}
}
输出结果:
enterClosed
enterLocked
enterUnlocked
enterOpened