strategy pattern

µðÀÚÀÎ ÆÐÅÏÀº °´Ã¼ ÁöÇâÀÇ »ó¼Ó º¸´Ù´Â ±¸¼ºÀ» È°¿ëÀ» Áß¿ä½Ã ÇÑ´Ù.

A´Â BÀÌ´Ù º¸´Ù A´Â B¸¦ °¡Áö°í ÀÖ´Ù´Â ±¸¼ºÀ» È°¿ëÇÏ´Â °ÍÀÌ Â÷ÈÄ¿¡ »õ·Î¿î ±â´É Ãß°¡°¡ »ý±â
´õ¶óµµ ´õ À¯¿¬ÇÏ°Ô ´ëó ÇÒ ¼ö ÀÖ´Ù.

Ç÷¯±× ÀÎ °³³äÀÇ ±âº»ÀÌ µÇ´Â ÆÐÅÏ ÀÌ ÆÐÅÏÀÌ´Ù.

 

strategy patternÀÇ µðÀÚÀÎ ¿øÄ¢

1. ´Þ¶óÁö´Â ºÎºÐÀ» ã¾Æ³»°í, ´Þ¶óÁöÁö ¾Ê´Â ºÎºÐÀ¸·ÎºÎÅÍ ºÐ¸®½ÃŲ´Ù.

2. ±¸ÇöÀÌ ¾Æ´Ñ ÀÎÅÍÆäÀ̽º¿¡ ¸ÂÃç¼­ ÇÁ·Î±×·¡¹ÖÇÑ´Ù.

3. »ó¼Óº¸´Ù ±¸¼ºÀ» È°¿ëÇÑ´Ù.

 

Context¿¡¼­ strategyInterface¸¦ ÀÌ¿ëÇÏ¿© ¾Ë°í¸®ÁòÀ» ½ÇÇà ÇÑ´Ù.

ConcreteStrategyA, ConcreteStrategyB, ConcreteStrategyC Áß¿¡ ¾î¶² °ÍÀ» ¼³Á¤(set_strategy) ÇÏ´À³Ä¿¡
µû¶ó¼­ ½ÇÇàÀÌ ´Þ¶óÁø´Ù.

Context´Â »ó¼ÓÀ» ÀÌ¿ëÇؼ­ ±â´É Ãß°¡°¡ µÇ´Â °ÍÀÌ ¾Æ´Ï¶ó, ±¸¼ºÀ» ÀÌ¿ëÇؼ­ ±â´ÉÀ» Ãß°¡ÇÏ°í ÀÖ´Ù.

 

#include <iostream>

 

using namespace std;

 

class StrategyInterface

{

public:

    virtual void execute() = 0;

};

 

class ConcreteStrategyA: public StrategyInterface

{

public:

    virtual void execute()

    {

        cout << "Called ConcreteStrategyA execute method" << endl;

    }

};

 

class ConcreteStrategyB: public StrategyInterface

{

public:

    virtual void execute()

    {

        cout << "Called ConcreteStrategyB execute method" << endl;

    }

};

 

class ConcreteStrategyC: public StrategyInterface

{

public:

    virtual void execute()

    {

        cout << "Called ConcreteStrategyC execute method" << endl;

    }

};

 

class Context

{

private:

    StrategyInterface *_strategy;

 

public:

    Context(StrategyInterface *strategy):_strategy(strategy)

    {

    }

 

    void set_strategy(StrategyInterface *strategy)

    {

        _strategy = strategy;

    }

 

    void execute()

    {

        _strategy->execute();

    }

};

 

int main(int argc, char *argv[])

{

    ConcreteStrategyA concreteStrategyA;

    ConcreteStrategyB concreteStrategyB;

    ConcreteStrategyC concreteStrategyC;

 

    Context contextA(&concreteStrategyA);

    Context contextB(&concreteStrategyB);

    Context contextC(&concreteStrategyC);

 

    contextA.execute();

    contextB.execute();

    contextC.execute();

 

    contextA.set_strategy(&concreteStrategyB);

    contextA.execute();

    contextA.set_strategy(&concreteStrategyC);

    contextA.execute();

 

    return 0;

}

 

¼Ò½º:  state_pattern.cpp

 

ÂüÁ¶ ½ÎÀÌÆ®:

http://en.wikipedia.org/wiki/Strategy_pattern

http://funeasy.tistory.com/28