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

13. 프락시 패턴(Proxy Pattern) - 가상 프락시 [Escort GoF의 디자인 패턴]

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

13. 프락시 패턴(Proxy Pattern) - 가상 프락시

 

13.1 개요

 

 이번에는 프락시 패턴 중에서 가상 프락시에 대해 살펴보기로 합시다.

 

 가상 프락시는 실제 개체의 특정 행위를 수행하는 비용이 클 때 사용이 됩니다. 사용자가 가상 프락시 개체를 통해 비용이 많이 드는 작업을 요청하면 가상 프락시 개체는 이 작업을 별도의 쓰레드에서 수행하게 명령만 내립니다. 이를 통해 사용자는 비용이 큰 작업을 수행 요청했을 시에 수행이 완료될 때까지 기다리지 않고 다른 작업을 수행할 수 있게 됩니다.

 

13. 2 시나리오

 

 여수 엑스포를 다녀와서 사진 보정 작업을 수행하였습니다. 그리고 이번에는 사진들을 소셜 사이트에 올려볼까 하는데 사진들의 사이즈가 너무 커서 모두 줄이고 올려야 했습니다. 사진 사이즈를 조절하는 응용은 하나의 사진을 변환 요청하면 이 작업이 완료되기 전에는 다른 작업을 할 수가 없었습니다. 이는 너무 많은 시간을 소요하는 지루한 작업이었죠. 다음에도 똑같은 작업을 할 수 있을 것 같아서 간단한 응용을 하나 만들었습니다. 내가 사진을 변환하라고 명령을 하면 도우미 개체가 변환기에게 변환 명령을 내릴 수 있게 만들었습니다. 그리고 도우미 개체를 통해 지금 변환 중인지 변환이 완료되었는지 알 수 있게 하였습니다. 이를 통해 기존에 찍었던 다른 사진들도 사이즈를 조절하여 소셜 사이트에 올리는 작업을 비교적 수월하게 할 수 있었습니다.


가상 프락시 패턴



AboutVirtualProxy.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)

 

//IConvert.h

#pragma once

#include "common.h"

 

class IConvert

{

public:

             virtual void SetImage(string image)=0;

             virtual void ClearImage()=0; 

             virtual string ConvertImage()=0;

             virtual string GetImage()=0;

};

 

//ImageConverter.h

#pragma once

#include "IConvert.h"

class ImageConverter:public IConvert

{

             string image;        

public:

             ImageConverter();

             virtual void SetImage(string image);    

             virtual void ClearImage();

             virtual string ConvertImage();

             virtual string GetImage();

};

 

//ImageConverter.cpp

#include "ImageConverter.h"

#include <windows.h>

ImageConverter::ImageConverter(void)

{           

             image = "";

}

 

void ImageConverter::SetImage(string image)

{

             this->image = image;

}

void ImageConverter::ClearImage()

{

             SetImage("");

}

string ImageConverter::ConvertImage()

{

             char buf[256];

             strcpy(buf,image.c_str());

                          

             int len = strlen(buf);

             int i=0;

             for( i= 0; i<len ; i++)

             {                         

                           if(isupper(buf[i]))

                           {

                                        Sleep(300);

                                        buf[i] = buf[i]-('A'-'a');

                           }                         

             }

             buf[i]=0;

             image = buf;

             return image;

}

string ImageConverter::GetImage()

{

             return image;

}

 

//VirtualConverter.h

#pragma once

#include "ImageConverter.h"

#include <windows.h>

class VirtualConverter:public IConvert

{           

             ImageConverter *realconverter;

             HANDLE hThread; 

public:

             VirtualConverter();

             ~VirtualConverter();

             virtual void SetImage(string image);    

             virtual void ClearImage();

             virtual string ConvertImage();

             virtual string GetImage();

private:

             static DWORD WINAPI DoIt(LPVOID pin);

};

 

//VirtualConverter.cpp

#include "VirtualConverter.h"

#include <windows.h>

VirtualConverter::VirtualConverter(void)

{

             realconverter = new ImageConverter();

             hThread = INVALID_HANDLE_VALUE;

}

 

VirtualConverter::~VirtualConverter(void)

{

             CloseHandle(hThread);

             delete realconverter;

}

 

void VirtualConverter::SetImage(string image)

{

             realconverter->SetImage(image);

}

void VirtualConverter::ClearImage()

{

             realconverter->ClearImage();

}

string VirtualConverter::ConvertImage()

{

             DWORD ThreadID;

             hThread = CreateThread(0,0,DoIt,realconverter,0,&ThreadID);

             return "변환을 시작하였습니다.";

}

string VirtualConverter::GetImage()

{           

             if(hThread == INVALID_HANDLE_VALUE)

             {

                           return "";

             }

             DWORD dw = WaitForSingleObject(hThread,0);

             if(dw == WAIT_TIMEOUT)

             {

                           return "변환 ";

             }           

             return realconverter->GetImage();

}

DWORD WINAPI VirtualConverter::DoIt(LPVOID pin)

{

             ImageConverter *ic = (ImageConverter *)pin;

             ic->ConvertImage();

             return 0;

}

 

//Demo.cpp

#include "VirtualConverter.h"

int main()

{

             VirtualConverter *mc = new VirtualConverter();

             VirtualConverter *mc2 = new VirtualConverter();

             mc->SetImage("EVERYDAY IS A HOLIDAY.");

             mc2->SetImage("WELCOME TO EHCLUB.NET.");

             mc->ConvertImage();

             mc2->ConvertImage();

             for(int i = 0; i<4;i++)

             {

                           cout<<mc->GetImage()<<endl;

                           cout<<mc2->GetImage()<<endl;;

                           Sleep(2000);

             }           

             delete mc2;

             delete mc;            

             return 0;

}


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

 


반응형