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