一个简单的有限状态机的实现

  1. #include <iostream>
  2. using namespace std;
  3. class Door
  4. {
  5. public:
  6.     virtual void open() {
  7.         cout<<"Door Opening...!"<<endl;
  8.     }
  9.     virtual void close() {
  10.         cout<<"Door Closing...!"<<endl;
  11.     }
  12. };
  13. //forward decl
  14. class OpenState;
  15. class ClosedState;
  16. class DoorFSM;
  17. class DoorState
  18. {
  19. public:
  20.     virtual void open_door(DoorFSM *pfsm) = 0;
  21.     virtual void close_door(DoorFSM *pfsm) = 0;
  22. };
  23. class DoorFSM : public Door
  24. {
  25. public:
  26.     DoorFSM(DoorState *pInitState);
  27.     void open_door();
  28.     void close_door();
  29.     void setState(DoorState* pState);
  30. private:
  31.     DoorState *m_State;
  32. };
  33. class OpenState : public DoorState
  34. {
  35. public:
  36.     static DoorState* InstancePtr()
  37.     {
  38.         if (!m_instance) {
  39.             m_instance = new OpenState();
  40.         }
  41.         return m_instance;
  42.     }
  43.     virtual void open_door(DoorFSM *pfsm);
  44.     virtual void close_door(DoorFSM *pfsm);
  45. protected:
  46.     OpenState() {}
  47.     static OpenState* m_instance;
  48. };
  49. OpenState* OpenState::m_instance = NULL;
  50. class ClosedState : public DoorState
  51. {
  52. public:
  53.     static DoorState* InstancePtr()
  54.     {
  55.         if (!m_instance) {
  56.             m_instance = new ClosedState();
  57.         }
  58.         return m_instance;
  59.     }
  60.     virtual void open_door(DoorFSM *pfsm);
  61.     virtual void close_door(DoorFSM *pfsm);
  62. protected:
  63.     ClosedState() {}
  64.     static ClosedState* m_instance;
  65. };
  66. ClosedState* ClosedState::m_instance = NULL;
  67. void OpenState::open_door(DoorFSM *pfsm)
  68. {
  69.     //open open
  70. }
  71. void OpenState::close_door(DoorFSM *pfsm)
  72. {
  73.     pfsm->setState(ClosedState::InstancePtr());
  74.     pfsm->close();
  75. }
  76. void ClosedState::open_door(DoorFSM *pfsm)
  77. {
  78.     pfsm->setState(OpenState::InstancePtr());
  79.     pfsm->open();
  80. }
  81. void ClosedState::close_door(DoorFSM *pfsm)
  82. {
  83.     //closed close
  84. }
  85. //implement FSM part below
  86. DoorFSM::DoorFSM(DoorState *pInitState)
  87. :m_State(pInitState)
  88. {}
  89. void DoorFSM::open_door()
  90. {
  91.     m_State->open_door(this);
  92. }
  93. void DoorFSM::close_door()
  94. {
  95.     m_State->close_door(this);
  96. }
  97. void DoorFSM::setState(DoorState *pState)
  98. {
  99.     m_State = pState;
  100. }
  101. int main(int argc, char *argv[])
  102. {
  103.     DoorFSM fsm(ClosedState::InstancePtr());
  104.     
  105.     fsm.close_door();
  106.     fsm.open_door();
  107.     fsm.open_door();
  108.     fsm.close_door();
  109.     
  110.     cout<<"seprate line........"<<endl;
  111.     
  112.     DoorFSM fsm2(OpenState::InstancePtr());
  113.     fsm2.close_door();
  114.     fsm2.open_door();
  115.     fsm2.open_door();
  116.     fsm2.close_door();
  117.     
  118.     cin.get();
  119.     return 0;
  120. }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值