Wzorzec Stan (ang. state) generuje obiekt, który w trakcie istnienia zmienia swój typ – oczekiwane są różne zachowania pewnego obiektu. Tworzony jest jako zestaw obiektów – obiekt komunikacyjny i wykonawczy. Wzorzec zakłada przełączanie się obiektu komunikacyjnego pomiędzy obiektami wykonawczymi w celu sprowokowania innego działania tych samych wywołań funkcji. Przydatny jest zamiast tworzenia nowego kodu warunkowego w postaci funkcji.
#include <iostream>
class CCreature
{
public:
enum State
{
state_unknown = -1,
state_eat,
state_walk
};
private:
class CState
{
State m_state;
public:
CState(State state = state_unknown) : m_state(state)
{
}
virtual void execute() = 0;
virtual State state() { return m_state; }
};
class CEat : public CState
{
public:
CEat() : CState(state_eat) {}
virtual void execute() { std::cout << "eat" << std::endl; }
};
class CWalk : public CState
{
public:
CWalk() : CState(state_walk) {}
virtual void execute() { std::cout << "walk" << std::endl; }
};
CState* m_pState;
public:
CCreature() : m_pState(new CWalk())
{
}
void execute()
{
if (m_pState)
m_pState->execute();
}
void eat()
{
if (m_pState && m_pState->state() != state_eat)
{
delete m_pState;
m_pState = new CEat();
}
}
void walk()
{
if (m_pState && m_pState->state() != state_walk)
{
delete m_pState;
m_pState = new CWalk();
}
}
};
int main(int nArguments, char* szArguments[])
{
CCreature c;
c.execute();
c.eat();
c.execute();
return 0;
}
0 Komentarzy