今天做到leetcode第8题——字符串转换整数,给一串不规则的字符串读取出其中的整数,博主想当然的用ifelse写出了相应代码,不过边界问题在一次次调试后才完善,觉得代码编写繁重且易出错,在看了官方解答之后才发现还有状态机可以用。一番查询后了解到一些需要用到大量复杂的if else,switch case语句的情况,可以用有限状态机来降低程序的复杂性,提高代码可维护性,但是使用状态机的话子类会变多,造成类膨胀,两者的平衡需要开发者自己判断。
状态机,网上大多以电梯举例,可以很方便的查询到,就不再重复讲述了。
按我自己的理解,状态机就是在状态机在某个状态下,受到某个事件的推动,进入到另一个状态,当然状态和事件是关联的,不是任意的状态和事件组合都能触发状态转换。比如只有电梯处于停止运行,且电梯门处于关闭的状态下,电梯门才可以进行打开的动作,进入到电梯门打开的状态。
以官方图解为例,字符串刚输入时,状态机就处于start状态,此状态下,若下一个接收的分割字符为空格,则状态依然为start,继续接收,收到number则进入in_number状态,然后再接收到空格、加减符号或other字符则进入end状态,其他情况类似。
编写代码,需要编写一个状态机类,然后不同状态的子类继承于这个类,(当然状态机少的话也可以直接创建),在这些子类中编写方法,来进行下一步的动作,调用另一个状态机子类。
具体可以参考EventBus-实现java状态机 - 简书 (jianshu.com)
相比网上大部分以电梯为例(都差不多,估计是转载或抄袭的),这一篇的代码更加的详细以及理解运作原理。