有限状态机的个人感悟并附简单的代码说明

有限状态机个人理解简单的代码示意个人理解有限状态机FSM也是设计模式中的状态机模式。可以将上层需要做的逻辑判断延迟到状态子类中,让每个状态实现自己逻辑判断。在一定程度上减少了每个状态之间的耦合,并且有新的需求增加时,可以清晰的以增加一个类的方式扩展状态。简单的代码示意 //上层逻辑实现 BaseFSM* pJohnFSM = new JohnController();//创建人物John的状态机 while (1) { pJohnFSM->Update(); } //状

个人理解

  阅读了一些关于有限状态机的章节后,有了以下简单的理解。自己也动手写了个用于自动化测试的项目,但总感觉自己还是没有完全驾驭这个设计模式。真希望在未来的某个时候能真正看到高手写的比较好的状态机模式源码。
  有限状态机FSM也是设计模式中的状态机模式。
  可以将上层需要做的逻辑判断延迟到状态子类中,让每个状态实现自己逻辑判断。在一定程度上减少了每个状态之间的耦合,并且有新的需求增加时,可以清晰的以增加一个类的方式扩展状态。

参考书目

《程序设计与数据结构》周立功 C
《游戏人工智能编程案例精粹》第二章 C++
《Unity3D人工智能编程精粹》第五章 C#

简单的代码示意

 //上层逻辑实现(可以简单在main()调用)
 BaseFSM* pJohnFSM = new JohnController();//创建人物John的状态机
 while (1)
 {   
  pJohnFSM->Update();//上层不需要判断逻辑,被延迟到子类,看着比较简洁
 }

 //状态机类管理着当前状态
 class JohnController :public BaseFSM
 {
  AbstractState* m_curState;//状态机保存着一个指向当前状态的父类指针
  
  void Update()
  {
   m_curState->Excute();//此处父类指针实质是指向子类状态对象的,利用了动态多态的特性
  }

  void ChangeState(AbstractState* pNewState)
  {
   m_curState = pNewState;//状态转移的关键在于父类指针指向不同的子类状态对象
  }
 }

 //纯虚状态类 
 Class AbstractState
 {
  public:
   virtual void Excute() = 0;//子类状态重写该虚函数以完成逻辑判断
 }

 //逻辑判断延迟到状态子类
 class DrinkState :public AbstractState
 {
  public:
   void Excute()//每个状态实现自己的行为,以及事件转移的逻辑判断
   {
    Drink();

    if (drinkOver)
    {
     ChangeState(WorkState);//喝完水干活
    }
   }
 }

版权声明:本文为博主qq_44183732原创文章,版权归属原作者,如果侵权,请联系我们删除!

原文链接:https://blog.csdn.net/qq_44183732/article/details/122549340

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
扎眼的阳光的头像扎眼的阳光普通用户
上一篇 2022年1月17日 下午9:29
下一篇 2022年1月17日 下午10:25

相关推荐