¸â¹ö ÇÔ¼ö Æ÷ÀÎÅÍ2

<Ŭ·¡½º ³»¿¡¼­ ¸â¹ö ÇÔ¼ö Æ÷ÀÎÅ͸¦ »ç¿ëÇϱâ>

Ŭ·¡½º³»¿¡¼­ ¸â¹öÇÔ¼ö¸¦ »ç¿ëÇÏ´Â ¹æ¹ýÀº °£´ÜÇÏ´Ù.
State Pattern¿¡ ÀÀ¿ëÇÒ ¼ö ÀÖ´Ù. Ŭ·¡½º¸¦ »ó¼Ó ÇÒ ÇÊ¿ä°¡ ¾øÀ¸¹Ç·Î °£´ÜÇÑ State Pattern ´ë½Å »ç¿ëÇϸé
Æí¸®ÇÏ´Ù.

Äڵ尡 ªÀ¸¹Ç·Î ¼Ò½º·Î ¼³¸íÇÑ´Ù.

//1. ¸â¹ö ÇÔ¼ö ŸÀÔ ¼±¾ð

typedef bool ( Command::*CmdType ) ( int id );

 

//2. SetCurState¿¡ Command °´Ã¼ÀÇ ¸â¹ö ÇÔ¼ö ¼±¾ðÈÄ

//Execute¿¡ ÀÇÇØ ¸â¹ö ÇÔ¼ö¸¦ ½ÇÇàÇÑ´Ù.

class Command

{

public:

    Command(){  m_cmdFunc = NULL; }

    virtual ~Command(){};

 

    bool SitDown(int id)

    {

        std::cout << "¾É´Ù" << std::endl;

        return true;

    }

 

    void SetCurState( CmdType cmdFunc )

    {

        m_cmdFunc = cmdFunc;

    }

    void Execute()

    {

        (this->*m_cmdFunc)( 0 );

    }

 

protected:

    CmdType  m_cmdFunc;

};

 

//3. ½ÇÁ¦ ¸â¹ö ÇÔ¼ö Àû¿ë

    Command command;

    command.SetCurState( &Command::SitDown );

    command.Execute();

<¹®ÀÚ¿­À» ÀÌ¿ëÇÑ ¸â¹ö ÇÔ¼ö Æ÷ÀÎÅÍ ÀÌ¿ë>

À̹ø Àå¿¡¼­´Â ÀÏ¹Ý ¸â¹ö ÇÔ¼öÀÇ Æ÷ÀÎÅ͸¦ std::map¿¡ ÀúÀåÇÏ¿© ½ÇÇàÇØ º»´Ù.

typedef bool ( Command::*CmdType ) ( int id );

typedef std::pair<const char*, CmdType>   MakeCmd;

typedef std::map<const char*, CmdType, StriLess >  CmdMap;

½ÇÇà ÇÒ Å¬·¡½ºÀÇ ¸â¹ö ÇÔ¼ö Æ÷ÀÎÅ͸¦ ¼±¾ðÇÑ´Ù.
std::map¿¡ ÀÔ·ÂÇϱâ À§ÇÑ pair¸¦ ¸¸µç´Ù.  <¹®ÀÚ¿­, ÇÔ¼ö Æ÷ÀÎÅÍ> ¼øÀ¸·Î µ¥ÀÌÅÍ´Â ÀԷµȴÙ.
std::map µ¥ÀÌÅÍ Å¸ÀÔÀ» ¼±¾ðÇÑ´Ù. StriLess´Â ºñ±³ Ŭ·¡½ºÀÌ´Ù.

class StriLess: public std::binary_function<const char*, const char*, bool>

{

public:

    result_type operator() (first_argument_type x, second_argument_type y) const

    {

        return _stricmp( x, y ) < 0;

    }

};

StriLess´Â ´ë¼Ò¹®ÀÚ ±¸ºÐ¾øÀÌ x°¡ yº¸´Ù ÀÛÀºÁö ºñ±³Çϴ Ŭ·¡½ºÀÌ´Ù.

 

class Command

{

    CmdMap cmdTable;

public:

    Command(){ m_cmdFunc = NULL;  }

    virtual ~Command(){}

 

    bool SitDown(int id)

    {

        std::cout << "¾É´Ù" << std::endl;

        return true;

    }

    bool Walk(int id)

    {

        std::cout << "°È´Ù" << std::endl;

        return true;

    }

    bool Run(int id)

    {

        std::cout << "´Þ¸®´Ù" << std::endl;

        return true;

    }

 

    void Init();

    void Process( char* str );

 

    void SetCurState( CmdType cmdFunc )
    {

        m_cmdFunc = cmdFunc;

    }

    void Execute()

    {

        if( m_cmdFunc )

            (this->*m_cmdFunc)( 0 );

    }

protected:

    CmdType  m_cmdFunc;

};

 

 

void Command::Init()

{

    cmdTable.insert( MakeCmd( "sit", &Command::SitDown ) );

    cmdTable.insert( MakeCmd( "walk", &Command::Walk ) );

    cmdTable.insert( MakeCmd( "run", &Command::Run ) );

}

 

void Command::Process( char* str )

{

    CmdMap::iterator iter = cmdTable.find( str );

    if( iter != cmdTable.end() )

    {

        (this->*iter->second)( 3 );

    }

}

Command Ŭ·¡½º´Â ÇÑ °³ÀÇ °´Ã¼¸¸ »ý¼º µÇ´Â°É·Î ÇÑÁ¤ÇÑ´Ù.
CmdTable cmdTableÀ» ¼±¾ðÇÑ´Ù.
Command::Init()¿¡¼­ cmdTable¿¡ °ªÀ» ³Ö´Â´Ù.

Command::Process´Â °ÔÀÓ ·çÇÁ¿¡¼­ ºÒ·ÁÁö´Â ¸Þ¼ÒµåÀÌ´Ù.

"sit"À» ³Ñ±â¸é SitDown()ÀÌ ½ÇÇà µÈ´Ù.

(this->*iter->second)( 3 )  ¹®ÀåÀº Command °´Ã¼ÀÇ ¸Þ¼Òµå¸¦ ½ÇÇàÇÑ´Ù.

 

¼Ò½º : CmdTable1.zip

ÂüÁ¶: ·Ñ Ç÷¹À× °ÔÀÓ ÇÁ·Î±×·¡¹Ö (»çÀ̹ö ÃâÆÇ»ç) 138page