为应用构造有限状态机方法下物业

内燃机2021年09月06日

3.3 定制状态机 目前得到的状态机已经能够响应来自外部的各种事件,并适当地调整自己当前所处的状态,也就是说已经实现了状态机引擎的功能,接下来要做的就是根据应用的具体需求来进行定制,为状态机加入与软件系统本身相关的那些处理逻辑。在FSME中,与具体应用相关的操作称为输出(Output),它们实际上就是一些需要用户给出具体实现的虚函数,自动生成的状态机引擎负责在进入或者退出某个状态时调用它们。 仍然以控制城门的那个状态机为例,假设我们希望在进入每个状态时都添加一部分处理逻辑。首在FSME界面左边的树形列表选择\"Outputs\"项,然后按下键盘上的Insert键来添加一个新的输出,接着在右下方的\"Name\"文本框中输入相应的名称,再单击\"Apply\"按钮,一个新的输出就创建好了,如图7所示。用同样的办法可以添加状态机所需要的所有输出。 图7 添加输出当所有的输出都定义好之后,接下来就可以为状态机中的每个状态绑定相应的输出。首先在FSME界面左侧的\"States\"项中选择相应的状态,然后从右下角的\"Available\"列表框中选择与该状态对应的输出,再单击\"\"按钮将其添加到\"In\"列表中。用同样的办法可以为状态机中的所有状态设置相应的输出,同一个状态可以对应有多个输出,其中In列表中的输出会在进入该状态时被调用,而Out列表中的输出则会在退出该状态时被调用,输出调用的顺序是与其在In或者Out列表中的顺序相一致的。 由于对状态机模型进行了修改,我们需要再次生成状态机的框架代码,不过这次不需要加上-d参数:     [xiaowp@linuxgam\" code]$ fsmc m -o DoorFSM.h  [xiaowp@linuxgam code]$ fsmc m -d -impl DoorFSM.h -o p

我们在新的状态机模型中添加了enterOpend、enterClosed、enterLocked和enterUnlocked四个输出,因此生成的类DoorFSM中会包含如下几个纯虚函数        virtual void enterOpened() = 0;    virtual void enterLocked() = 0;    virtual void enterUnlocked() = 0;    virtual void enterClosed() = 0;

显然,此时生成的状态机框架不能够再被直接编译了,我们必须从类DoorFSM派生出一个子类,并提供对这几个纯虚函数的具体实现:   /*    * DoorFSMLogic.h   * 状态机控制逻辑的头文件   */  #include \"DoorFSM.h\"    class DoorFSMLogic : public DoorFSM   {      protected:   virtual void enterOpened();    virtual void enterLocked();    virtual void enterUnlocked();    virtual void enterClosed();   };

正如前面所提到过的,这几个函数实际上代表的正是应用系统的处理逻辑,作为例子我们只是简单地输出一些提示信息:   /*    * p   * 状态机控制逻辑的实现文件   */  #include \"DoorFSMLogic.h\"  #include     void DoorFSMLogic::enterOpened()  {    std::cout \"Enter Opened state.\" std::endl;  }    void DoorFSMLogic::enterClosed()  {    std::cout \"Enter Closed state.\" std::endl;  }    void DoorFSMLogic::enterLocked()  {    std::cout \"Enter Locked state.\" std::endl;  }    void DoorFSMLogic::enterUnlocked()  {    std::cout \"Enter Unlocked state.\" std::endl;  }

但是 同样,为了对生成的状态机进行验证,我们还需要手工编写一段测试代码:   /*    * p   * 测试状态机逻辑   */  #include \"DoorFSMLogic.h\"    int main()   {   DoorFSMLogic door;   door.A(DoorFSM::Close);   door.A(DoorFSM::Lock);   door.A(DoorFSM::Unlock);   door.A(DoorFSM::Open);  }

使用下面的命令能够将生成的状态机框架和测试代码编译成一个可执行文件:   [xiaowp@linuxgam code]$ g++ p p p -o logic

运行结果如下所示:   [xiaowp@linuxgam code]$ ./logic  Enter Closed state.  Enter Locked state.  Enter Unlocked state.  Enter Opened state.

四、小结 在面向对象的软件系统中,有些对象具有非常复杂的生命周期模型,使用有限状态机是描述这类对象最好的方法。作为一种软件设计模式,有限状态机的概念虽然不算复杂,实现起来也并不困难,但它的问题是当状态机的模型复杂到一定的程度之后,会带来实现和维护上的困难。Linux下的FSME是一个可视化的有限状态机建模工具,而且支持状态机框架代码的自动生成,借助它可以更加轻松地构建基于有限状态机的应用系统。

教师节礼物 草珊瑚含片
宏济堂小儿消食片
南宁包皮过长治疗费用
相关阅读
为什么你会为爱情而扭曲

为什么你会为爱人情而改变,只是因为,你厌恶夺去。当你恐惧夺去一个人的...

2024-12-27
深圳要蒸发了?DQ海岸城新店高能来袭,掀起今夏潮cool风暴!

走入DQ在海岸城的新近门超市 流泪满脸问号,这真的不是潮牌超市吗? 润酷...

2024-09-08
关乎大资金动向!科创板“芯片”指数来了,42只样本股名单公布;上交所几大指数也调整,腾讯、美团等权重

A股、公司股票多个极其重要指标公布或修正,这意味着之外的大资金样式也...

2024-06-24
54岁郑钧好可怕,与小16岁娇妻在机场热吻,剪齐刘海刻意扮嫩

过去的服装辅以领域已经形成了用语的品味,相同的用语有相同的品味标准和...

2024-06-02
民间故事:新媳妇回娘家,见继父做荒唐事,相劝不成梦中被骗身

元代大安末年,胡山阳县药王庙山村有个都官叫杨辅大,他膝下有两个女儿,...

2024-05-16
每经14点 | 国家医保局:继续降低乙型肝炎、核酸检测等价格;雄安新区为拟挂牌上市企业提供“一对一管

每经总编:陈鹏程 1丨雄安高新区为拟万科母该公司民营企业提供“PK管家式...

2024-05-11
友情链接