这是最简单的状态机模型。通过代理命令来解决互斥的状态问题。如果某一状态需要捕获上一个状态,则需要对该模型稍加修改——一个常见且简洁的做法是利用状态 stack 来记录历史状态。

class ObjectState
                {
                public:
                	virtual void update(void*host) = 0;
                	virtual void onEnter(void*);
                	virtual void onExit(void*);
                	std::string getStateName(){ return _name; }
                protected:
                	std::string _name;
                };
                
                
                
                class Hero
                {
                public:
                
                	void input(int c);
                
                	void update();
                
                private:
                	ObjectState*_state;
                
                };
                
                
                
                class HeroState :public ObjectState
                {
                public:
                	virtual void update(void*host)final
                	{
                		this->update(static_cast<Hero*>(host));
                	}
                	virtual void update(Hero*host) = 0;
                };
                
                
                class JumpState:public HeroState
                {
                public:
                	virtual void update(Hero*host)override
                	{
                		cout << __FUNCTION__ << endl;
                	}
                
                };
                
                
                
                class IdleState :public HeroState
                {
                public:
                	virtual void update(Hero*host)override
                	{
                		cout << __FUNCTION__ << endl;
                	}
                
                };
                
                
                
                
                void Hero::input(int c)
                {
                
                
                	if (c == 'W')	_state = new IdleState;
                	if (c == 'S')	_state = new JumpState;
                
                
                }
                
                void Hero:: update()
                {
                	this->_state->update(this);
                }
                
                int main(int argc, char *argv[])
                {
                
                	Hero player;
                
                
                	while (true)
                	{
                	//	Sleep(100);
                		char c= getch();
                
                		player.input(c);
                		player.update();
                
                	}
                
                
                	system("pause");
                	return 0;
                }