- 1、本文档共3页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
设设计计模模式式之之状状态态机机模模式式
Hello,笔者最近⼯作被领导要求写了⼀个状态机,说实在的,笔者之前从没有写过状态机(越做⼯作越发现⾃⼰越菜),所以不得已找了⼀些⽹上的⼀些资料,发现其实
状态机也有特定的设计模式的,所以我想针对我这个项⽬聊⼀聊状态机这个事情。说实在的,这个事情看起不太⼤,但是⾥⾯要注意的东西真⼼不少,因此,笔者决定分成
两篇博客写,这篇博客主要针对状态模式以及我的项⽬初步的了解状态机怎么写,之后的⽂章就聊⼀聊项⽬中应该注意的点以及状态机写的时候应该注意些什么。
⼀、状态机是什么
⼆、项⽬背景⼤致说明
三、状态机设计思想和图
四、状态模式和策略模式的区别
⼀、状态机是什么?
所谓状态机,就是当⼀个对象状态转换的条件表达式过于复杂的时候,把状态的判断逻辑转换到不同状态的⼀系列类当中去。这样解释可能有点抽象,我们举⼀个简单
的例⼦,我们以电梯为例,电梯可以分成开门,关门,上升/下落,停⽌这五个部分。⾸先我们要明确两点,就是⾸先这五种状态在同⼀时间只能出现⼀个,其次,这五种状态在
满⾜某种条件后是可以相互转换的,⽐如下落到某楼层后就会进⼊停⽌状态,那么这也是状态机使⽤的两个前提,第⼀,在某段时间内只准许出现⼀种状态,第⼆,这些状态在
满⾜某些条件后是可以相互转换的。
⼆、项⽬背景⼤致说明
这个项⽬背景⼤概是这样的,当前我们有四个状态,分别为IDLE状态,PREPARE状态,PROCESSING状态,POSTPONE状态,其中每种状态的切换依赖于两种条
件(因为这⾥涉及到⼯作隐私,所以就不写那么详细了),另外,PREPARE状态,PROCESSING状态,POSTPONE状态如果持续⼀段时间,那么他们就会退回IDLE状态,
⼤致情况就是这样,详情请看图⽚。
三、状态机的设计思想和类图
我的设计思想是这样的:⾸先整体分成六个类,我们姑且把这些类称为stateManager,IDLE,PREPARE,PROCESSING以及POSTPONE以及FSMInterface类。其中
stateManager类作为管理类,分别管理状态的迁移以及传输判断条件,⽽FSMInterface类作为接⼝类,作为IDLE,PREPARE,PROCESSING和POSTPONE的⽗类。其具体
的类图如图所⽰。
我们从做向右看这个类图,SensorManager中的sensorstate,infraredstate,crIndex,startFlag这四个成员变量都是判断条件所依赖的全局变量,s则表⽰当前所处的状态,⼀
旦有条件改变状态时,我们只要调⽤setstate函数就可以改变函数了。另外我们看SensorManager中的调⽤函数handle函数,handle函数⽤调⽤state中的handle,利⽤多态
的⽅法调⽤状态机的处理函数。它的时序图如图所⽰。
其代码如图所⽰:
//外部条件改变stateManager的全局变量
classstateManager
{
private:
intm_sensorState;
intcrIndex;
intstartFlag;
//std::vectorint32_tm_infraredState;
pblic:
voidsetStartFlag(intvale);
intgetStartFlag();
voidsetSensorState(intstate);
voidsetInfraredState(int32_tindex,intstate);
boolgetSensorState();
stateManager();
virtal~stateManager();
voidsetState(State*vale);
voidhandle();
voidsetCrIndex(intvale);
intgetCrIndex();
std::shared_ptrStatecrrent;//当前状态
std::mapint32_t,intm_infraredSt
文档评论(0)