状态机的原理简析及重要用途

来源:互联网 发布:sms水动力学软件 编辑:程序博客网 时间:2024/06/07 21:05

如果说业务是如一个人的躯体,那么状态机就如同一个人的灵魂。若一个灵魂不清楚的人,做什么事情也会糊里糊涂,若他脑子清楚明白,做什么事情都能一步到位。
应用的状态机可以简单概述为:应用从一个无用的不稳定状态,不断迁移,一致迁移到一个有用的问题状态。一个应用可以有很多状态机,不同状态机之间可以关联也可以无关联。
作为一个码农按俺的抽象能力确实不咋的,难道和我出身农家有关,所以我总把复杂和抽象的问题简单化,具体化,大白话,恐怕别人听不懂。今天我就把另一种技术也大白话吧!
一个应用的只所以能够串起来,动起来就要有一个灵魂,就是怎么实现具体的业务逻辑,实现的最佳方法就是状态机。
一个应用从发起到结束有一个完整的生命周期,它在整个生命中大部分时间处于某个稳定的状态并且有用状态的咱们称它为稳态,在进入问稳态前他肯定要经历各个不稳定状态。状态机就是标记从不稳定状态不断迁移,最后进入问题状态的全局变量。当然稳定状态是相互,他也会从稳定状态迁移到不稳定状态,最后再迁移到这个稳定状态。如:应用刚开始启动时处于登陆初试化状态(当有登陆失败时进入登陆失败状态,这个状态可以没有),当登陆成功时处于登陆成功状态(稳定状态),这时你就可以进行各种操作了。当你玩腻了想换个帐户了,就退出吧,那么你就进入未登陆状态(由于你在这个状态通常不能做核心的事情,所以可以不称它为稳定状态),当你再次登陆成功,你就又进入登陆成功状态。当你的退出应用了,那就不用记录了吧。这个是最简单的登陆状态机。类似的如接单业务的订单状态机。有的应用要根据当时处于某些页面,当关闭应用再打开应用时,要进入上次的页面。这最适合用状态机实现了。实际上很多人在用各种复杂的方式实现状态机,没有用最简单直接的方式实现。
状态机最简单直白的描述是用一个枚举类型的全局变量记录应用所处不同的状态,根据这个全局变量进入不同的页面或处理不同的逻辑。一个应用可以有不同状态机(不同的枚举类型的全局变量),枚举类型的全局变量可以记录到文件中或数据库中(如:对象存储 core dat中或文件沙盒,MFC的对象持续化是存于数据库中),下次登陆可以读取这个枚举类型的全局变量并且跳到不同的页面和流程。
我做的一个APP的网络触发式自动登录状态机枚举类型:

typedef NS_ENUM(NSInteger,LOGIN_STATE) {    LOGIN_STATE_INIT = 0,    LOGIN_STATE_LOGIN_SUCESS,    LOGIN_STATE_LOGINING,    LOGIN_STATE_UNAUTO_LOGIN,    LOGIN_STATE_UNNET_LOGIN,    LOGIN_STATE_EXIT_LOGIN};

我做的一个APP的网络触发式自动登录状态机逻辑图:
这里写图片描述

1 0