- #include <iostream>
- using namespace std;
- class Door
- {
- public:
- virtual void open() {
- cout<<"Door Opening...!"<<endl;
- }
- virtual void close() {
- cout<<"Door Closing...!"<<endl;
- }
- };
- //forward decl
- class OpenState;
- class ClosedState;
- class DoorFSM;
- class DoorState
- {
- public:
- virtual void open_door(DoorFSM *pfsm) = 0;
- virtual void close_door(DoorFSM *pfsm) = 0;
- };
- class DoorFSM : public Door
- {
- public:
- DoorFSM(DoorState *pInitState);
- void open_door();
- void close_door();
- void setState(DoorState* pState);
- private:
- DoorState *m_State;
- };
- class OpenState : public DoorState
- {
- public:
- static DoorState* InstancePtr()
- {
- if (!m_instance) {
- m_instance = new OpenState();
- }
- return m_instance;
- }
- virtual void open_door(DoorFSM *pfsm);
- virtual void close_door(DoorFSM *pfsm);
- protected:
- OpenState() {}
- static OpenState* m_instance;
- };
- OpenState* OpenState::m_instance = NULL;
- class ClosedState : public DoorState
- {
- public:
- static DoorState* InstancePtr()
- {
- if (!m_instance) {
- m_instance = new ClosedState();
- }
- return m_instance;
- }
- virtual void open_door(DoorFSM *pfsm);
- virtual void close_door(DoorFSM *pfsm);
- protected:
- ClosedState() {}
- static ClosedState* m_instance;
- };
- ClosedState* ClosedState::m_instance = NULL;
- void OpenState::open_door(DoorFSM *pfsm)
- {
- //open open
- }
- void OpenState::close_door(DoorFSM *pfsm)
- {
- pfsm->setState(ClosedState::InstancePtr());
- pfsm->close();
- }
- void ClosedState::open_door(DoorFSM *pfsm)
- {
- pfsm->setState(OpenState::InstancePtr());
- pfsm->open();
- }
- void ClosedState::close_door(DoorFSM *pfsm)
- {
- //closed close
- }
- //implement FSM part below
- DoorFSM::DoorFSM(DoorState *pInitState)
- :m_State(pInitState)
- {}
- void DoorFSM::open_door()
- {
- m_State->open_door(this);
- }
- void DoorFSM::close_door()
- {
- m_State->close_door(this);
- }
- void DoorFSM::setState(DoorState *pState)
- {
- m_State = pState;
- }
- int main(int argc, char *argv[])
- {
- DoorFSM fsm(ClosedState::InstancePtr());
- fsm.close_door();
- fsm.open_door();
- fsm.open_door();
- fsm.close_door();
- cout<<"seprate line........"<<endl;
- DoorFSM fsm2(OpenState::InstancePtr());
- fsm2.close_door();
- fsm2.open_door();
- fsm2.open_door();
- fsm2.close_door();
- cin.get();
- return 0;
- }
一个简单的有限状态机的实现
最新推荐文章于 2024-07-17 04:06:02 发布