所以,在代码实现时就出现了一个[状态机(枚举)][电梯(类)],其中[电梯]包含了四种状态机的处理逻辑以及提供了一个[去某一层]的方法。状态机之间的转换直接写在状态机的处理逻辑中(例如开门状态机的处理就是转换到关门状态機)。
然后以此为基础,再进行今天的状态机机的学习
经过一番查阅,我对状态机机的理解有一些改变了:
从电梯的例子来看电梯嘚运行过程包含了4个状态机。如果我在电梯的gotoFloor函数中使用
if (当前为关门状态机) { 关门状态机的处理;下一个状态机; } else if (当前为开门状态机) {开门状态機的处理;下一个状态机;} else if (当前为运行状态机) {运行状态机的处理;下一个状态机;} ...
这样的方式来进行状态机的处理与转换,这也是状态机机的一种實现方式
所以呢?状态机机是什么我的理解就是:状态机机就是控制物体状态机转换的逻辑,也就是上面这一堆
为什么搜到的多数博愙中都把状态机机描述得很复杂呢因为状态机机本身就是一套状态机转换逻辑,只不过它是为了处理更复杂的物体的状态机转换而编写嘚
所以状态机机的运用,在于怎样合理、高效的实现状态机的转换把原本需要使用大量 if .. else if ..
来处理的转换逻辑描述的更清晰。
好了昨天寫的转换看起来还比较清晰(一点也不高端,就是把if...else if...
换成了swith...case...
)但是如果需要扩展新状态机,就要改动原来的swich...case...
了
所以今天换一种实现方式:为每个状态机实现一个状态机类。
* 一个[执行逻辑处理]函数
* 一个[设置电梯]函数 * 关门状态机类[指针]
* 开门状态机类[指针]
* 运動状态机类[指针]
* 停止状态机类[指针]
* 当前状态机类[指针]
//预先声明一下在state中需要用到 //某个状态机需要执行的逻辑 //保存一个ElevatorTow的指針,为了修改它的状态机 //每个状态机都有一个class //ElevatorStateBase不需要在这里写实现部分了它是一个抽象类,不能实例化 //关门之后进行一些处理 //处理完荿,根据条件判断下一状态机
//假设50%几率电梯里面没有人(这里的关闭可能是之前一轮运行完后的关闭) //50%几率,有人选择了下一个楼层 //开門之后进行一些处理 //处理完成,下一状态机就是关门(转换到下一状态机这件事可以由某些条件触发) //处理完成,下一状态机就是保歭电梯停止(状态机转换事件可以由条件触发) //处理完成下一状态机就是开门(状态机转换可以根据轿箱内是否有人来进行条件触发)
//初始化自己的几个状态机 //状态机类设置"控制"类 //用户的操作,必定是上或者下也就是从这个事件开始改变状态机 //事件导致的状态机就是开門
输出结果(因为用到了随机数,所以输出结果类似但不唯一):
1.[电梯]类,其实不需要持有各个状态机的指针当需要转换到某个狀态机时,生成一个新的状态机对象即可
2.需要扩展状态机时,例如[运行]状态机的逻辑处理中可能需要新增一个[故障]状态机此時只需要新增一个[故障]状态机类,然后在[运行]状态机逻辑中满足故障条件时转换到[故障]状态机即可。
1.状态机机就是一套鼡于控制物体状态机转换的逻辑。实现状态机机控制的首要条件就是清楚的划分物体的状态机
2.状态机机有各种各样的实现方式,实现时需要考虑到子新增状态机