2016년 1월 18일 월요일

Strategy Pattern (전략 패턴)

의도
  • 동일 계열의 알고리즘군을 정의하고, 각각의 알고리즘을 캡슐화하며, 이들을 상호 교환이 가능하도록 만드는 패턴
이럴 때 사용하자.
  • 행동이 조금씩 다를 뿐 관련된 많은 클래스들일 존재할 때
  • 알고리즘의 변형이 필요할 때
  • 사용자가 몰라야 하는 데이터를 사용하는 알고리즘이 있을 때
  • 하나의 클래스가 많은 행동을 정의하고, 이런 행동들이 그 클래스의 연산 안에서 복잡한 다중 조건문의 모습을 취할 때
장점은?
  • 동일 계열의 관련 알고리즘군이 생김
  • 서브클래싱을 사용하지 않는 대안임
  • 조건문을 없앨 수 있음
  • 구현의 선택이 가능함
단점은?
  • 서로 다른 전략을 알아야 함
  • Strategy 객체와 Context 객체 사이에 의사소통 오버헤드가 있음
  • 객체 수가 증가함
코드
Strategy 클래스
class Strategy
{
public:
   virtual void Algorithm() = 0;
};

ConcreteStrategyA, ConcreteStrategyB 클래스
class ConcreteStrategyA : public Strategy
{
public:
   void Algorithm() {
      cout << "ConcreteStrategyA" << endl;
   };
};
class ConcreteStrategyB : public Strategy
{
public:
   void Algorithm() {
      cout << "ConcreteStrategyB" << endl;
   };
};

Context 클래스
class Context
{
public:
   Context() {};
   void SetStrategy(Strategy* pStrategy) {
      m_pStrategy = pStrategy;
   };
   void Do() {
      m_pStrategy->Algorithm();
   };
private:
   Strategy* m_pStrategy;
};

실행 부분
void main()
{
   Context* pContext = new Context();

   Strategy* pStrategyA = new ConcreteStrategyA();
   pContext->SetStrategy(pStrategyA);
   pContext->Do();

   Strategy* pStrategyB = new ConcreteStrategyB();
   pContext->SetStrategy(pStrategyB);
   pContext->Do();
   
   delete pStrategyA;
   delete pStrategyB;
   delete pContext;
}

UML - class 다이어그램
참고
  • GoF의 디자인 패턴(개정판) 재사용성을 지닌 객체지향 소프트웨어의 핵심요소

댓글 없음:

댓글 쓰기

참고: 블로그의 회원만 댓글을 작성할 수 있습니다.