-----------------------------------------------------------------------------
[Strategy]
의도:
다양한 알고리즘이 존재하면 이들 각각을 하나의 클래스로 캡슐화하여 알고리즘의 대체가 가능
하도록 한다. Strategy패턴을 이용하면 클라이언트와 독립적인 다양한 알고리즘으로 변형할 수
있다. 알고리즘을 바구더라도 클라이언트는 아무런 변경을 할 필요가 없다.
다른 이름:
Policy
참고:
Policy-based design이 Strategy을 이용한 디자인 방법이다.
-----------------------------------------------------------------------------
/////////////////////////////////////////////////////////////////////////////
//
// A Behavioral part of GoF's Design Patterns
//
// - Strategy
//
/////////////////////////////////////////////////////////////////////////////
#include <windows.h>
#include <tchar.h>
#include <iostream>
/////////////////////////////////////////////////////////////////////////////
//
// Strategy
//
//
/////////////////////////////////////////////////////////////////////////////
class Strategy
{
public:
virtual ~Strategy() {}
public:
virtual void AlgorithmInterface(void) = 0;
};
template <typename Strategy>
class Context
{
public:
void operator() ()
{
Strategy_.AlgorithmInterface ();
}
private:
Strategy Strategy_;
};
class ContextByRunTime
{
public:
explicit ContextByRunTime (Strategy *s) :
Strategy_ (s)
{
}
public:
void operator() ()
{
Strategy_->AlgorithmInterface ();
}
private:
Strategy *Strategy_;
};
class ConcreteStrategyA : public Strategy
{
public:
virtual void AlgorithmInterface(void)
{
std::cout << "ConcreteStrategyA::AlgorithmInterface()" << std::endl;
}
};
class ConcreteStrategyB : public Strategy
{
public:
virtual void AlgorithmInterface(void)
{
std::cout << "ConcreteStrategyB::AlgorithmInterface()" << std::endl;
}
};
class ConcreteStrategyC : public Strategy
{
public:
virtual void AlgorithmInterface(void)
{
std::cout << "ConcreteStrategyC::AlgorithmInterface()" << std::endl;
}
};
/////////////////////////////////////////////////////////////////////////////
//
// Startup
//
//
/////////////////////////////////////////////////////////////////////////////
int _tmain(int argc, _TCHAR* argv[])
{
ConcreteStrategyA s1;
ConcreteStrategyB s2;
ConcreteStrategyC s3;
ContextByRunTime cr1(&s1);
ContextByRunTime cr2(&s2);
ContextByRunTime cr3(&s3);
Context<ConcreteStrategyA> cc1;
Context<ConcreteStrategyB> cc2;
Context<ConcreteStrategyC> cc3;
std::cout << "by run-time" << std::endl;
cr1();
cr2();
cr3();
std::cout << std::endl;
std::cout << "by compile-time" << std::endl;
cc1();
cc2();
cc3();
return 0;
}
-----------------------------------------------------------------------------
by run-time
ConcreteStrategyA::AlgorithmInterface()
ConcreteStrategyB::AlgorithmInterface()
ConcreteStrategyC::AlgorithmInterface()
by compile-time
ConcreteStrategyA::AlgorithmInterface()
ConcreteStrategyB::AlgorithmInterface()
ConcreteStrategyC::AlgorithmInterface()