state pattern

¿¹Àü¿¡ C·Î °øÀå ÀÚµ¿È­ ÇÁ·Î±×·¡¹ÖÀ» ÇÒ ¶§³ª, ÇÑ±Û ¿ÀÅ丶Ÿ ÇÁ·Î±×·¡¹ÖÀ» ÇÒ ¶§, switch - case ¹®À¸·Î

µµ¹èÇÏ¿© ÇÁ·Î±×·¡¹ÖÀ» Çß´Ù.

 

°¡·É ÀÌ·± ÄÚµå ¹æ½ÄÀÌ´Ù.

int m_state = 0;

 

 

void Process

{

    switch( m_state )

    {

    case 0:

        if( CheckWeight() )

            m_state = 1;

        break;

    case 1:

        if( FillWater() )

            m_state = 2;

        break;

    case 2:

        if( MixTank() )

            m_state = 3;

        break;

    case 3:

        Alarm();

        break;

    }

}

 

Äڵ带 °£´ÜÇÏ°Ô Â®±â ¶§¹®¿¡, º¹ÀâÇØ º¸ÀÌÁö ¾Ê´Â´Ù. ½ÇÁ¦·Î ÇÁ·Î±×·¡¹Ö ÇÏ°Ô µÈ´Ù¸é, state¸¦ À̸®Àú¸®

¿À°¡´Â ÄÚµå·Î ÀÎÇÏ¿©, ÄÚµå´Â ÁöÀúºÐÇÏ°Ô µÈ´Ù.

 

ÀÌ°ÍÀ» ÇØ°áÇϱâ À§ÇÑ ÆÐÅÏÀÌ state ÆÐÅÏÀÌ´Ù. switch - case ¹®À» state ÆÐÅÏÀ¸·Î ¹Ù²Ù´Â ¹æ¹ýÀº case¸¦

ÇϳªÀÇ state Ŭ·¡½º·Î ¹Ù²Ù¸é µÈ´Ù.

 

 

À§ÀÇ UML ó·³ case ¹®À» Concreate StateA, Concreate StateB ó·³ º¯È¯ ÇÏ¸é µÈ´Ù.

 

Context::ChangeState()¹®À» ÅëÇØ State¸¦ ¹Ù²Û´Ù.
ChangeState¹®À» State Ŭ·¡½º ³»ºÎ¿¡¼­ È£ÃâÇÏ´Â ¹æ½Ä°ú ¿ÜºÎ¿¡¼­ È£ÃâÇÏ´Â ¹æ½ÄÀÌ ÀÖ´Ù.
³»ºÎ¿¡¼­ È£Ãâ ÇÏ´Â ¹æ½ÄÀÌ ³»°¡ º¸±â¿¡´Â ±ò²ûÇØ º¸¿©¼­ ³»ºÎ¿¡¼­ ¹Ù²Ù´Â ¹æ½ÄÀ¸·Î Çß´Ù.

 

State::Execute() ¸Þ½îµå´Â ¾÷µ¥ÀÌÆ® ¸¶´Ù È£Ã⠵Ǵ ¸Þ½îµå·Î ³»ºÎ¿¡¼­ Á¶°Ç¹®¿¡ µû¶ó
ChangeState()¸¦ ½ÇÇàÇØ ÁØ´Ù.

 

//actor.cpp

#include <stdio.h>

#include <iostream>

 

//actor »óŸ¦ state ÆÐÅÏÀ¸·Î ±¸ÇöÇØ º»´Ù.

 

class IState;

class ActorStandState;

class ActorJumpState;

class ActorFallState;

 

//--------------------------------------------------------

class IContext

{

public:

    IContext() {  m_pState = NULL;   }

    virtual ~IContext();

    virtual void  ChangeState( IState* pNextState );

    virtual void  SetAnimation( const char* szAnimation ) = 0;

    virtual float GetJumpHeight() = 0;  

 

protected:

    IState* m_pState;

};

 

 

class IState

{

public:

    virtual void Enter( IContext* pContext ) = 0;

    virtual void Exit( IContext* pContext ) = 0;

    virtual void Execute( IContext* pContext ) = 0;

};

//--------------------------------------------------------

IContext::~IContext()

{

    if( m_pState )

    {

        delete m_pState;

        m_pState = NULL;

    }

}

//--------------------------------------------------------

void IContext::ChangeState( IState* pNextState )

{

    if( m_pState )

    {

        m_pState->Exit( this );

        delete m_pState;

    }

 

    m_pState = pNextState;

    m_pState->Enter( this );

}

 

class ActorStandState : public IState

{

public:

    void Enter( IContext* pContext )

    {

        pContext->SetAnimation( "stand" );

    }

    void Exit( IContext* pContext )

    {

 

    }

    void Execute( IContext* pContext );

};

//--------------------------------------------------------

class ActorJumpState : public IState

{

public:

    void Enter( IContext* pContext )

    {

        pContext->SetAnimation( "jump" );

    }

    void Exit( IContext* pContext )

    {

 

    }

    void Execute( IContext* pContext );

};

//--------------------------------------------------------

class ActorFallState : public IState

{

public:

    void Enter( IContext* pContext )

    {

        pContext->SetAnimation( "fall" );

    }

    void Exit( IContext* pContext )

    {

 

    }

    void Execute( IContext* pContext );

};

 

//--------------------------------------------------------

void ActorStandState::Execute( IContext* pContext )

{

    std::cout << "ActorStandState" << std::endl;

 

    if( pContext->GetJumpHeight() >= 0.1f )    //Á¡ÇÁ ½ÃÀÛ

        pContext->ChangeState( new ActorJumpState );

}

//--------------------------------------------------------

void ActorJumpState::Execute( IContext* pContext )

{

    std::cout << "ActorJumpState" << std::endl;

 

    if( pContext->GetJumpHeight() >= 1.0f )   //actor´Â ÃÖ°í 1¹ÌÅͱîÁö Á¡ÇÁÇÑ´Ù.

        pContext->ChangeState( new ActorFallState );

}

//--------------------------------------------------------

void ActorFallState::Execute( IContext* pContext )

{

    std::cout << "ActorFallState" << std::endl;

 

    if( pContext->GetJumpHeight() <= 0.0f )

        pContext->ChangeState( new ActorStandState );

}

//--------------------------------------------------------

class Actor : public IContext

{

public:

    Actor()

    {

        m_height = 0.0f;

    }

 

    void  SetAnimation( const char* szAnimation )   {};

    float GetJumpHeight()  { return m_height; }

    void  SetJumpHiehgt( float height ) { m_height = height; }

    void  Update()

    {

        m_pState->Execute( this );

    }

    float    m_height;

};

 

 

void main()

{

    Actor actor;

    actor.ChangeState( new ActorStandState );

 

    float height = 0.0f;

    for( ; height <= 1.0f; height += 0.3f )

    {

        actor.SetJumpHiehgt( height );

        actor.Update();

    }

 

    for( ; height >= 0.0f; height -= 0.3f )

    {

        actor.SetJumpHiehgt( height );

        actor.Update();

    }

 

    actor.Update();

}

 

À§ÀÇ ÄÚµå ¿¹´Â ij¸¯ÅÍ°¡ Á¡ÇÁ ÇÒ ¶§ÀÇ »óŸ¦ »óÅ ÆÐÅÏÀ¸·Î ¸¸µç °ÍÀÌ´Ù.

ÆÐÅÏÀº ´ÙÀ½°ú °°´Ù.

 

ij¸¯ÅÍ°¡ Áö¸éÀ§¿¡ ¼­ ÀÖÀ» ¶§ ÆÐÅÏ

Á¡ÇÁÇÏ¿© ¿Ã¶ó°¡´Â ÁßÀ϶§,

Á¡ÇÁÈÄ ³»·Á ¿Ã¶§,

 

ÀÌ µé »óÅ´ Áö¸é°ú ³ôÀÌ¿¡ µû¶ó, »óÅ°¡ Á¤ÇØ Áø´Ù.

 

¼Ò½º:  state_pattern.cpp

 

ÂüÁ¶ ½ÎÀÌÆ®:

http://www.gotoandplay.it/_articles/2004/08/statePattern_p02.php

http://gpwiki.org/index.php/State_pattern

http://blogs.microsoft.co.il/blogs/gilf/archive/2008/08/02/state-pattern.aspx