第一篇,首先实现一个最简单的状态机。
- 外部不直接修改状态机的state,而是向状态机发送一个event,让状态机内部自行计算新的state
- 状态机内部维护一个状态转移表。key是event,value是目的状态
- key以str表示,value以类常量表示
- transit方法里接收事件作为参数,从transit_table里查找value,赋值给self.state字段
- get_state方法返回self.state字段的值
PS:之前还以为类定义中可以直接使用RED、YELLOW这些名字访问类属性(毕竟是在class的作用域里),没相当不行。还是要加上StateMachine.前缀
class StateMachine(object):
NULL = 0
RED = 1
YELLOW = 2
GREEN = 3
def __init__(self):
self.state = StateMachine.NULL
self.transit_table = {
'turn_red': StateMachine.RED,
'turn_yellow': StateMachine.YELLOW,
'turn_green': StateMachine.GREEN,
}
def transit(self, event):
self.state = self.transit_table.get(event)
def get_state(self):
return self.state
if __name__ == '__main__':
machine = StateMachine()
machine.transit('turn_red')
print(machine.get_state())
machine.transit('turn_yellow')
print(machine.get_state())
machine.transit('turn_green')
print(machine.get_state())