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

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *