This behavioral pattern is used to let objects behave differently based on their current state.
class GirlfriendState; class Girlfriend { public: Girlfriend(); ~Girlfriend(); void givePresent(); void forgetBirthday(); private: friend class GirlfriendState; GirlfriendState* m_State; }; class GirlfriendState { public: virtual void givePresent(GirlfriendState* state) {} virtual void forgetBirthday(GirlfriendState* state) {} }; class HappyState : public GirlfriendState { public: void forgetBirthday(GirlfriendState *state); }; class AngryState : public GirlfriendState { public: void givePresent(GirlfriendState *state); }; Girlfriend::Girlfriend() { m_State = new HappyState(); } Girlfriend::~Girlfriend() { delete m_State; } void Girlfriend::givePresent() { m_State->givePresent(this->m_State); } void Girlfriend::forgetBirthday() { m_State->forgetBirthday(this->m_State); } void HappyState::forgetBirthday(GirlfriendState* state) { delete state; state = new AngryState(); } void AngryState::givePresent(GirlfriendState* state) { delete state; state = new HappyState(); } int main() { Girlfriend gf; gf.forgetBirthday(); gf.givePresent(); // ... return 0; }