프로그래밍 기술/Escort GoF의 디자인 패턴

24. 전략 패턴(Strategy Pattern) [Escort GoF의 디자인 패턴]

언제나휴일 2016. 4. 4. 15:18
반응형

24. 전략 패턴(Strategy Pattern)

 

24.1 개요

 

 프로그래밍하다 보면 같은 문제를 해결하는 여러 가지 방법 중에 무엇을 사용하는 것이 효과적인지 고민을 하는 경우가 많습니다. 어떤 때에는 일단은 효율이 떨어져도 개발 비용이 적게 드는 방법으로 해결을 하고 차후에 개선된 알고리즘을 사용하여 교체를 하는 방법을 사용하기도 합니다. 이 경우에 알고리즘에 대한 추상화를 통해 전략 패턴을 적용하면 효과적으로 작업을 진행할 수 있습니다. 전략 패턴은 동일한 문제를 해결하기 위한 여러 알고리즘을 일반화하여 사용하는 부분에서 특정 알고리즘에 종속적이지 않고 독립적으로 사용할 수 있게 하는 패턴입니다.

 

 전략 패턴에서는 구체적으로 어떠한 방법으로 문제를 해결해야 할 지를 결정하지 못한 경우에 해당 부분만을 별도의 형식으로 추상화하여 사용함으로써 작업을 분리할 수 있습니다. 이를 통해 작업 분배가 쉬워질 수 있으며 다양한 문제 해결 방법에 대한 정의를 적은 비용으로 교체할 수 있게 함으로써 유연성 있는 프로그래밍을 할 수 있습니다.

 

24. 2 시나리오

 

 이번에 EH Camera 회사에서는 프로그래밍에 관심을 갖고 있는 학생들을 대상으로 경진대회를 진행하게 되었습니다. 그리고 저는 세 번째 관문인 설계와 구현 능력을 평가하는 실기 문제를 출제하게 되었죠. 강의를 하면서 시험 문제를 출제하는 것은 일상과 같지만 새로운 보석을 찾기 위해 진행하는 것을 알고 있기에 조심스럽게 접근하게 되네요.

 

 기본적인 문제 해결 능력을 갖고 있는지를 묻기에는 자료구조와 알고리즘에 대한 소재를 제시하는 것이 좋겠다는 생각을 갖고 있는데 변별력을 두기 위해 어떠한 구조를 요구할 지 고민을 하였습니다. 이러한 고민 끝에 여러 가지 멤버를 가진 사진 데이터를 벡터에 보관하여 관리하고 다양한 방법으로 사진 데이터를 보여주는 프로그램을 제시할 거예요. 그리고 사진 데이터를 보여주는 방법은 쉽게 추가 및 삭제할 수 있게 설계할 것을 주문할 생각이예요. 현재 제가 생각하는 것은 전략 패턴을 효과적으로 사용할 줄 아는지를 가지고 변별력을 주겠다는 거지요. 물론, 제가 생각하는 것보다 더 창의적인 표현들이 나올 수도 있기를 기원하면서 말이예요.


전략 패턴



AboutStrategy.zip

//common.h

#pragma once

 

#pragma warning (disable:4996)

#include <iostream>

 

using std::cout;

using std::endl;

#include <vector>

using std::vector;

#include <string>

using std::string;

 

#include <iomanip>

using std::ios;

#include <algorithm>

 

#pragma warning(disable:4482)

 

//Viewer.h

#pragma once

#include "Picture.h"

class Viewer

{           

public:

             virtual void ViewPicture(Picture *picture)=0;

};

 

//SimpleViewer.h

#pragma once

#include "Picture.h"

class SimpleViewer

             :public Viewer

{           

public:

             virtual void ViewPicture(Picture *picture)

             {

                           cout<<"사진 파일 :"<<picture->GetName()<<endl;                   

             }

};

 

//VerifyViewer.h

#pragma once

#include "Viewer.h"

class VerifyViewer

             :public Viewer

{           

public:

             virtual void ViewPicture(Picture *picture)

             {

                           cout<<"사진 파일 :"<<picture->GetName()<<endl;

                           cout<<"색조:"<<picture->GetTone()<<endl;

                           cout<<"명도:"<<picture->GetBrightness()<<endl;

                           cout<<"채도:"<<picture->GetSaturation()<<endl;

             }

};

 

//PictureCollection.h

#pragma once

#include "VerifyViewer.h"

#include "SimpleViewer.h"

typedef vector<Picture *> Pictures;

typedef vector<Picture *>::const_iterator PIter;

class PictureCollection

{

             Pictures pictures;

             Viewer *viewer[2];

             int mode;

public:

             PictureCollection()

             {

                           viewer[0] = new VerifyViewer();

                           viewer[1] = new SimpleViewer();

                           SetMode(0);

             }

             ~PictureCollection(void)

             {

                           delete viewer[0];

                           delete viewer[1];

             }

             void Add(Picture *picture)

             {

                           pictures.push_back(picture);

             }

             void SetMode(int mode)

             {

                           if(mode)

                           {

                                        this->mode = 1;                 

                           }

                           else

                           {

                                        this->mode = 0;                 

                           }

             }           

             void View()const

             {                          

                           ViewMode();

 

                           PIter seek = pictures.begin();

                           PIter end = pictures.end();

 

                           for(  ; seek != end; ++seek)

                           {

                                        viewer[mode]->ViewPicture(*seek);

                           }

             }

private:

             void ViewMode()const

             {

                           if(mode)

                           {                         

                                        cout<<"간략 보기 모드"<<endl;

                           }

                           else

                           {                         

                                        cout<<"자세히 보기 모드"<<endl;

                           }

             }

};

 

//Demo.cpp

#include "PictureCollection.h"

int main()

{

             Picture *picture1 = new Picture("천안 각원사",100,100,100);

             Picture *picture2 = new Picture("천안 유관순 열사 기념관",120,90,90);

            

             PictureCollection *pc = new PictureCollection();

 

             pc->Add(picture1);

             pc->Add(picture2);

 

             pc->View();

            

             pc->SetMode(1);

             pc->View();

 

             delete pc;

             delete picture2;

             delete picture1;

             return 0;

}


IT 전문가로 가는 길 Escort GoF의 디자인 패턴
국내도서
저자 : 장문석
출판 : 언제나휴일 2013.04.01
상세보기


반응형