״̬ģʽ----C++ʵÏÖ

2014-11-24 08:09:06 ¡¤ ×÷Õß: ¡¤ ä¯ÀÀ: 0

״̬ģʽ

¶¨Ò壺

ÔÊÐíÒ»¸ö¶ÔÏóÔÚÆäÄÚ²¿×´Ì¬¸Ä±äʱ¸Ä±äËüµÄÐÐΪ¡£¶ÔÏó¿´ÆðÀ´ËƺõÐÞ¸ÄÁËËüµÄÀà¡£

ʵÓÃÐÔ£º

1¡¢ Ò»¸ö¶ÔÏóµÄÐÐΪȡ¾öÓÚËüµÄ״̬£¬²¢ÇÒËü±ØÐëÔÚÔËÐÐʱ¿Ì¸ù¾Ý״̬¸Ä±äËüµÄÐÐΪ¡£

2¡¢ Ò»¸ö²Ù×÷Öк¬ÓÐÅÓ´óµÄ¶à·ÖÖ§Ìõ¼þÓï¾ä£¬ÇÒÕâЩ·ÖÖ§ÒÀÀµÓڸöÔÏóµÄ״̬¡£

Óŵ㣺

1¡¢ ½«ÓëÌØ¶¨×´Ì¬Ïà¹ØµÄÐÐΪ¾Ö²¿»¯£¬²¢ÇÒ½«²»Í¬×´Ì¬µÄÐÐΪ·Ö¸î¿ªÀ´¡£

2¡¢ ʹµÃ״̬ת»»ÏÔʾ»¯¡£

3¡¢ ״̬¶ÔÏó¿ÉÒÔ±»¹²Ïí¡£

½á¹¹£º

\

ʵÏÖ£º

class Context;

class State

{

public:

State(string name):m_name(name)

{ }

virtual void Handle(Context *pContext)

{ }

virtual~State()

{ }

string GetStateName()

{

returnm_name;

}

protected:

voidChangeState(Context *pContext,State *pState);

private:

string m_name;

};

class Context

{

public:

voidRequest()

{

m_pCurrentState->Handle(this);

}

voidSetCurrentState(State *pState)

{

cout<<"ÉèÖõ±Ç°×´Ì¬Îª :"< GetStateName()<

m_pCurrentState = pState;

}

State *GetCurrentState()

{

cout<<"µ±Ç°×´Ì¬Îª :"< GetStateName()<

returnm_pCurrentState;

}

protected:

friend class State;

void ChangeState(State *pState)

{

cout<<"µ±Ç°×´Ì¬ÓÉ : "< GetStateName()<<" ת±äΪ״̬£º"< GetStateName()<

m_pCurrentState = pState;

}

private:

State *m_pCurrentState;

};

voidState::ChangeState(Context *pContext,State *pState)

{

pContext->ChangeState(pState);

}

//״̬×ÓÀà¿ÉÒÔ¹²Ïí£¬ËùÒÔÓõ¥Àýģʽ£¬ÕâÀï¾ÍºöÂÔÄÚ´æÊͷŵÄÎÊÌâÁË

class ConcreteStateA;

class ConcreteStateC:public State

{

public:

staticState* GetStateAInstance()

{

if(m_pInstance == NULL)

{

m_pInstance = new ConcreteStateC("״̬ C");

}

returnm_pInstance;

}

voidHandle(Context *pContext);

private:

ConcreteStateC(string name):State(name)

{ }

staticConcreteStateC *m_pInstance;

};

class ConcreteStateB:public State

{

public:

staticState* GetStateAInstance()

{

if(m_pInstance == NULL)

{

m_pInstance = new ConcreteStateB("״̬ B");

}

returnm_pInstance;

}

voidHandle(Context *pContext)

{

cout<<"״̬ B ´¦ÀíµÄÒµÎñÂß¼­"<

ChangeState(pContext,ConcreteStateC::GetStateAInstance());

}

private:

ConcreteStateB(string name):State(name)

{ }

staticConcreteStateB *m_pInstance;

};

class ConcreteStateA:public State

{

public:

staticState* GetStateAInstance()

{

if(m_pInstance == NULL)

{

m_pInstance = new ConcreteStateA("״̬ A");

}

returnm_pInstance;

}

voidHandle(Context *pContext)

{

cout<<"״̬ A ´¦ÀíµÄÒµÎñÂß¼­"<

ChangeState(pContext,ConcreteStateB::GetStateAInstance());

}

private:

ConcreteStateA(string name):State(name)

{ }

staticConcreteStateA *m_pInstance;

};

voidConcreteStateC::Handle(Context *pContext)

{

cout<<"״̬ C ´¦ÀíµÄÒµÎñÂß¼­"<

ChangeState(pContext,ConcreteStateA::GetStateAInstance());

}

ConcreteStateA*ConcreteStateA::m_pInstance = NULL;

ConcreteStateB*ConcreteStateB::m_pInstance = NULL;

ConcreteStateC*ConcreteStateC::m_pInstance = NULL;

Context *pContext = new Context;

pContext->SetCurrentState(ConcreteStateA::GetStateAInstance());

pContext->Request();

pContext->Request();

pContext->Request();