state.h
class CContext;
class CState
{
public:
CState(){}
virtual ~CState(){}
virtual void Execute(CContext* apcContext) = 0;
virtual std::string GetState() = 0;
};
class CStateB;
class CStateA : public CState
{
public:
CStateA(){}
virtual ~CStateA(){}
void Execute(CContext* apcContext);
std::string GetState();
};
class CStateB : public CState
{
public:
CStateB(){}
virtual ~CStateB(){}
void Execute(CContext* apcContext);
std::string GetState();
};
state.cpp
#include "state.h"
#include "context.h"
void CStateA::Execute(CContext* apcContext)
{
apcContext->ChangeState(new CStateB());
}
std::string CStateA::GetState()
{
return "A state";
}
void CStateB::Execute(CContext* apcContext)
{
apcContext->ChangeState(new CStateA());
}
std::string CStateB::GetState()
{
return "B state";
}
context.h
#include <string>
class CState;
class CContext
{
public:
CContext(CState* apoState);
virtual ~CContext();
void ChangeState(CState* apoState);
void Execute();
std::string GetState();
private:
CState* mpoState;
};
context.cpp
#include "context.h"
#include "state.h"
CContext::CContext(CState* apoState)
{
mpoState = apoState;
}
CContext::~CContext()
{
if (mpoState != NULL)
{
delete mpoState;
mpoState = NULL;
}
}
void CContext::ChangeState(CState* apoState)
{
if (mpoState != NULL)
{
delete mpoState;
mpoState = NULL;
}
mpoState = apoState;
}
void CContext::Execute()
{
mpoState->Execute(this);
}
std::string CContext::GetState()
{
return mpoState->GetState();
}
stateTest.cpp
#include "state.h"
#include "context.h"
int main(int argv, char* argc[])
{
CContext* lpoCContext = new CContext(new CStateA());
printf("%s\n", lpoCContext->GetState().c_str());
lpoCContext->Execute();
printf("%s\n", lpoCContext->GetState().c_str());
lpoCContext->Execute();
printf("%s\n", lpoCContext->GetState().c_str());
}