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

14. 프락시 패턴(Proxy Pattern) - 보호용 프락시 [Escort GoF의 디자인 패턴]

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

14. 프락시 패턴(Proxy Pattern) - 보호용 프락시

 

14.1 개요

 

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

 

 보호 프락시는 사용자가 실제 개체의 특정 행위를 수행할 수 있는 권한이 있는지를 확인할 필요가 있을 때 사용됩니다.

 

14. 2 시나리오

 

 저녁에 가족들과 같이 TV를 시청하면서 사생활 보호에 관한 얘기를 나누게 되었어요. 얘기하다 보니 어디까지 공유해야 하고 보호해야 하는지에 대한 생각이 서로 많이 다르더군요. 얘기를 나누면서 우리 가족은 서로에 대한 신뢰를 바탕으로 자신이 생각이 제일 중요하다는 결론에 도달했습니다. 그리고 저는 방으로 들어가 새로운 형태의 사진 관리 응용을 만들어 보았습니다. 기존의 응용에서는 단순히 메모리 카드에 있는 사진을 옮기고 보정 작업을 해 주었는데 이번에 만든 응용에서는 사진을 보호된 저장소에 보관할 수 있게 하였습니다. 소유자가 접근할 수 있는 사용자를 지정할 수 있게 한 것이죠. 그렇지만 이 응용은 크게 사용할 일이 없을 것이라 믿어요.


보호용 프락시 패턴



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

 

//IView.h

#pragma once

#include "common.h"

 

class IView

{

public:

             virtual void View()const=0;   

             virtual string GetOwner()const=0;       

};

 

//Picture.h

#pragma once

#include "common.h"

#include "IView.h"

class Picture: public IView

{

             const string name; 

             const string owner;

public:

             Picture(string name,string owner);

             virtual void View()const;      

             virtual string GetOwner()const;           

};

 

//Picture.cpp

#include "Picture.h"

 

Picture::Picture(string name,string owner):name(name),owner(owner)

{           

}

void Picture::View()const

{           

             cout<<"파일 :"<<name<<" 소유자:"<<owner<<endl;

}

string Picture::GetOwner()const

{

             return owner;

}

 

//ProtectionPicture.h

#pragma once

#include "Picture.h"

typedef vector<string> UserList;

typedef vector<string>::const_iterator UIter;

class ProtectionPicture :

             public IView

{

             Picture *picture;                 

             UserList available_users;

             string user;

public:

             ProtectionPicture(string name,string owner);

             ~ProtectionPicture(void);                   

             virtual void View()const;      

             virtual string GetOwner()const;           

             void AddAvailableUser(string owner,string user);

             void SetUser(string user);

private:

             bool IsAvailableUser(string user)const;

};

 

//ProtectionPicture.cpp

#include "ProtectionPicture.h"

 

ProtectionPicture::ProtectionPicture(string name,string owner)

{

             picture = new Picture(name,owner);

             user = "";

}

 

ProtectionPicture::~ProtectionPicture(void)

{

             delete picture;

}

 

void ProtectionPicture::View()const

{

             if(IsAvailableUser(user))

             {

                           picture->View();

             }

             else

             {

                           cout<<"사진을 있는 권한이 없습니다."<<endl;

             }

}

string ProtectionPicture::GetOwner()const

{

             return picture->GetOwner();

}

void ProtectionPicture::AddAvailableUser(string owner,string user)

{

             if(owner != GetOwner())

             {

                           cout<<"소유자 만이 사용 권한 설정을 있습니다."<<endl;

                           return;

             }

             if(IsAvailableUser(user)==false)

             {

                           available_users.push_back(user);

             }

}

 

void ProtectionPicture::SetUser(string user)

{

             this->user = user;

}

bool ProtectionPicture::IsAvailableUser(string user)const

{

             if(picture->GetOwner() == user)

             {

                           return true;

             }

             UIter seek = available_users.begin();

             UIter end = available_users.end();

 

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

             {

                           if((*seek) == user)

                           {

                                        return true;

                           }

             }

             return false;

}

 

//PictureManager.h

#pragma once

#include "ProtectionPicture.h"

typedef vector<IView *> Pictures;

typedef vector<IView *>::const_iterator PIter;

class PictureManager

{

             Pictures pictures;   

             string login_user;

public:   

             PictureManager(void);

             ~PictureManager(void);

             void Login(string user);

             void MakePicture(string name,UserList available_users);

             void MakePicture(string name);

             void ListPicture();

             void Logout();

private:

             ProtectionPicture * MakeProtectionPicture(string name,UserList available_users);

};

 

//PictureManager.cpp

#include "PictureManager.h"

 

PictureManager::PictureManager(void)

{

             login_user = "";

}

 

PictureManager::~PictureManager(void)

{

             PIter seek = pictures.begin();

             PIter end = pictures.end();

 

             IView *iview = 0;

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

             {

                           iview = *seek;

                           delete iview;

             }

 

}

void PictureManager::Login(string user)

{

             login_user = user;

             cout<<login_user<<"님께서 로긴 하였습니다."<<endl;

}

void PictureManager::MakePicture(string name)

{

             if(login_user != "")

             {

                           IView *iview = new Picture(name,login_user);

                           pictures.push_back(iview);

             }

}

void PictureManager::MakePicture(string name,UserList available_users)

{

             if(login_user != "")

             {

                           ProtectionPicture * pro_picture = MakeProtectionPicture(name,available_users);                          

                           pictures.push_back(pro_picture);

             }

}

void PictureManager::ListPicture()

{

             PIter seek = pictures.begin();

             PIter end = pictures.end();

 

             IView *iview = 0;

             ProtectionPicture * pro_picture = 0;

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

             {

                           iview = *seek;

                           pro_picture = dynamic_cast<ProtectionPicture *>(iview);

                           if(pro_picture)

                           {

                                        pro_picture->SetUser(login_user);

                           }

                           iview->View();

             }

}

void PictureManager::Logout()

{

             cout<<login_user<<"님께서 로그 아웃 하였습니다."<<endl;

             login_user = "";

}

ProtectionPicture * PictureManager::MakeProtectionPicture(string name,UserList available_users)

{

             ProtectionPicture * pro_picture = new ProtectionPicture(name,login_user);

             UIter seek = available_users.begin();

             UIter end = available_users.end();

 

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

             {

                           pro_picture->AddAvailableUser(login_user,*seek);

             }

             return pro_picture;

}

 

//Demo.cpp

#include "PictureManager.h"

int main()

{

             PictureManager *pm = new PictureManager();

             UserList avail_users;

            

             pm->Login("홍길동");

             pm->MakePicture("홍길동A",avail_users);

             avail_users.push_back("강감찬");

             pm->MakePicture("홍길동B",avail_users);

             pm->MakePicture("홍길동C");

             pm->ListPicture();

             pm->Logout();

 

             pm->Login("강감찬");

             pm->ListPicture();

             pm->Logout();

 

             delete pm;           

             return 0;

}


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


 

반응형