10. 퍼샤드 패턴(Facade Pattern)
10.1 개요
프로그래밍하다 보면 여러 종류의 라이브러리를 사용해야 하는 경우가 발생합니다. 그리고 실제 각 라이브러리에 있는 모든 기능을 사용할 필요가 없는 경우가 많지요. 이럴 때 상위 수준의 라이브러리를 만들어서 사용하기 쉽게 제공할 수 있습니다. 이처럼 상위 수준에서 인터페이스를 정의하여 하위 수준의 서브 시스템의 기능을 사용할 수 있게 하고자 할 때 퍼샤드 패턴을 사용하면 효과적입니다.
퍼샤드 패턴에서는 하위 수준의 여러 서브 시스템에서 제공되는 기능들을 상위 수준에서 단순화시켜 사용하기 쉽게 해 줍니다. 또한, 이를 통해 여러 서브 시스템과의 복잡한 관계를 느슨하게 만들어 주어 하위 시스템과 독립성을 갖게 해 줍니다.
10. 2 시나리오
오전 강의를 하고 있을 무렵 EH Camera의 이 매핑 씨에게 문자 메시지가 왔습니다.
"언휴 님, 이번에 사진을 관리하는 통합 모듈을 만들려고 하는데 참여하셨으면 합니다. 연락 주세요."
저는 강의가 마치는 데로 방문하겠다고 답문을 남기고 계속 강의를 진행하였습니다. 그리고 강의를 마치고 EH Camera를 방문했어요. 그리고 이 매핑 씨는 EH Camera 회사에서 기존에 제공했던 사진들을 관리하는 응용과 사진을 바로잡는 응용에서 제공했던 기능을 통합한 형태의 모듈과 응용을 개발한다고 하더군요.
"예, 매핑 씨. 제가 통합 모듈을 예광탄 형태로 만들어 볼 테니 저에게 사진을 관리하는 모듈의 인터페이스와 보정 모듈의 인터페이스를 알려주세요."
간단하게 이번에 진행할 프로젝트의 의도와 규모 등에 관해 얘기하고 필요한 자료들을 받고 헤어졌습니다. 집에 도착한 저는 두 개의 모듈에서 제공하는 인터페이스 중에서 독립적으로 필요한 기능들과 혼합해서 사용해야 할 작업을 분류하였습니다. 그리고 제공해야 할 기능들을 포함한 새로운 모듈을 제작하기 시작하였습니다. 사실 제가 작성한 모듈의 각 기능은 기존 모듈의 기능을 호출하는 것 외에 다른 작업을 한 것은 없었어요.
이처럼 기존 모듈을 사용하는 상위의 모듈을 작성하고 이를 사용하는 간단한 응용을 제작하여 문서로 만들고 보니 자야 할 시간이 되더군요. 다음 날 학교로 가기 전에 이 매핑 씨를 만나 작업한 결과들을 건네주고 학교로 향했습니다. 그리고 강의 도중에 다시 이 매핑 씨에게 문자 메시지가 왔습니다.
"언휴 님, 덕분에 이번 프로젝트는 빨리 끝날 것 같다고 하네요. 그리고 새로운 설계 방법을 알게 되었다면서 개발팀에서 좋아하는군요. "
//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>
//Picture.h
#pragma once
#include "common.h"
class Picture
{
int tone;
int brightness;
int saturation;
const string name;
public:
Picture(string name,int tone,int brightness,int saturation);
void Change(int tone,int brightness,int saturation);
bool IsEqual(string name);
void View();
string GetName()const;
};
//Picture.cpp
#include "Picture.h"
Picture::Picture(string name,int tone,int brightness,int saturation):name(name)
{
this->tone = tone;
this->brightness = brightness;
this->saturation = saturation;
}
void Picture::Change(int tone,int brightness,int saturation)
{
this->tone += tone;
this->brightness += brightness;
this->saturation += saturation;
}
bool Picture::IsEqual(string name)
{
return this->name == name;
}
void Picture::View()
{
cout<<"사진 이름:"<<name<<endl;
cout<<"색조:"<<tone<<" 명도:"<<brightness<<" 채도:"<<saturation<<endl;
}
string Picture::GetName()const
{
return name;
}
//Compensator.h
#pragma once
#include "Picture.h"
class Compensator
{
public:
void Change(Picture *picture,int tone,int brightness,int saturation)
{
picture->Change(tone,brightness,saturation);
}
};
//PictureManager.h
#pragma once
#include "Picture.h"
typedef vector<Picture *> Pictures;
typedef vector<Picture *>::iterator PIter;
class PictureManager
{
Pictures pictures;
public:
bool Exist(string name);
bool AddPicture(Picture *picture);
Picture *FindPicture(string name);
void View();
};
//PictureManager.cpp
#include "PictureManager.h"
bool PictureManager::Exist(string name)
{
return FindPicture(name)!=0;
}
bool PictureManager::AddPicture(Picture *picture)
{
if(Exist(picture->GetName()))
{
return false;
}
pictures.push_back(picture);
return true;
}
Picture *PictureManager::FindPicture(string name)
{
PIter seek = pictures.begin();
PIter end = pictures.end();
Picture *picture=0;
for( ; seek != end ; ++seek)
{
picture = (*seek);
if(picture->IsEqual(name))
{
return picture;
}
}
return 0;
}
void PictureManager::View()
{
PIter seek = pictures.begin();
PIter end = pictures.end();
Picture *picture=0;
for( ; seek != end ; ++seek)
{
picture = (*seek);
picture->View();
}
}
//SmartManager.h
#pragma once
#include "PictureManager.h"
#include "Compensator.h"
class SmartManager
{
Compensator *compensator;
PictureManager *pic_manager;
public:
SmartManager();
~SmartManager();
bool Exist(string name);
bool AddPicture(Picture *picture);
Picture *FindPicture(string name);
bool Change(string name,int tone,int brightness,int saturation);
void View();
};
//SmartManager.cpp
#include "SmartManager.h"
SmartManager::SmartManager(void)
{
compensator = new Compensator();
pic_manager = new PictureManager();
}
SmartManager::~SmartManager(void)
{
delete compensator;
delete pic_manager;
}
bool SmartManager::Exist(string name)
{
return pic_manager->Exist(name);
}
bool SmartManager::AddPicture(Picture *picture)
{
return pic_manager->AddPicture(picture);
}
Picture *SmartManager::FindPicture(string name)
{
return pic_manager->FindPicture(name);
}
bool SmartManager::Change(string name,int tone,int brightness,int saturation)
{
Picture *picture = FindPicture(name);
if(picture ==0)
{
return false;
}
picture->Change(tone,brightness,saturation);
return true;
}
void SmartManager::View()
{
pic_manager->View();
}
//Demo.cpp
#include "SmartManager.h"
int main()
{
Picture *picture = new Picture("언제나 휴일",100,100,100);
Picture *picture2 = new Picture("언제나 휴일2",100,100,100);
SmartManager *sm = new SmartManager();
sm->AddPicture(picture);
sm->AddPicture(picture2);
sm->Change("언제나 휴일",20,20,-50);
sm->View();
delete sm;
delete picture;
delete picture2;
return 0;
}
|
'프로그래밍 기술 > Escort GoF의 디자인 패턴' 카테고리의 다른 글
15. 프락시 패턴(Proxy Pattern) - 스마트 참조자 [Escort GoF의 디자인 패턴] (0) | 2016.04.04 |
---|---|
14. 프락시 패턴(Proxy Pattern) - 보호용 프락시 [Escort GoF의 디자인 패턴] (0) | 2016.04.04 |
13. 프락시 패턴(Proxy Pattern) - 가상 프락시 [Escort GoF의 디자인 패턴] (0) | 2016.04.04 |
12. 프락시 패턴(Proxy Pattern) - 원격지 프락시 [Escort GoF의 디자인 패턴] (0) | 2016.04.04 |
11. 플라이급 패턴(Flyweight Pattern) [Escort GoF의 디자인 패턴] (0) | 2016.04.04 |
9. 장식자 패턴(Decorator Pattern) [Escort GoF의 디자인 패턴] (0) | 2016.04.04 |
8. 복합체 패턴(Composite Pattern) [Escort GoF의 디자인 패턴] (0) | 2016.04.04 |
7. 가교 패턴(Bridge Pattern) [Escort GoF의 디자인 패턴] (0) | 2016.04.04 |
6. 적응자 패턴(Adapter Pattern) [Escort GoF의 디자인 패턴] (0) | 2016.04.04 |
5. 단일체 패턴(Singleton Pattern) [Escort GoF의 디자인 패턴] (0) | 2016.04.04 |