对于一个状态机来说,需要分成2个部分来考虑状态机,一是状态机本身,二是状态机的实现。
状态机推演
只有状态机本身是正确的,其实现才有意义,如下这篇文章介绍的非常好。https://zhuanlan.zhihu.com/p/59723017?utm_source=zhihu&utm_medium=social&utm_oi=793081648135684096
这篇文章中提出的状态机的四个问题:
- 图上表达了系统可能收到的所有事件吗?
- 我们推演了每个节点上可能收到的所有事件的处理吗?
- 我们有可能陷入某种状态而无法离开吗?
- 状态机可以化简吗?
非常值得我们思考。
http://www.processon.com/ 画上状态机,咱们就画
状态机实现
当我们用UML画出状态图后,就开始写状态机了。
interface Ilight {
void turn();
}
public StateMachine {
private Ilight l;
public void setCurLight(Ilight l) {
this.l = l;
}
public void turn() {
l.turn;
}
}
class On implement Ilight {
private final StateMachine s;
public On(Statemachine s) {
this.s = s;
s.setCurLight(Off);
}
}
class Off implement Ilight {
private final StateMachine s;
public Off(Statemachine s) {
this.s = s;
s.setCurLight(On);
}
}
这个例子就是一个最简单的开关灯的例子,使用的是状态模式,使用状态模式的好处是出了状态和事件,还可以在具体状态处加入action进行处理。
小结
状态模式在日常生活中使用的非常多,网站的登陆状态、电梯等,状态模式首先要认知到实际的状态图,因此要学习如何推演。对于状态机,有状态分支法、查表法、状态模式等几种实现。
网友评论