2016년 10월 23일 일요일

Facade Pattern (퍼사드 패턴)

의도
  • 인터페이스 집합에 대해 하나의 인터페이스를 제공하는 패턴
이럴 때 사용하자.
  • 복잡한 서브시스템에 대한 단순한 인터페이스 제공이 필요할 때
  • 추상 개념에 대한 구현 클래스와 사용자 사이에 너무 많은 종속성이 존재할 때
  • 서브시스템을 계층화시킬 때
장점은?
  • 클라이언트와 서브 시스템의 연결을 느슨하게 만듦
  • 서브시스템에 접근하는 인터페이스를 제공
  • 단순한 인터페이스로 복잡한 서브시스템을 감쌈
단점은?
  • 다른 구성요소에 대한 메소드 호출을 처리하기 위해 "래퍼"클래스를 많이 만들어야 할 수 있음
  • 시스템이 더 복잡해지고, 개발시간도 늘어나면서 성능의 저하도 있을 수 있음
코드
CExec 클래스
class CExec
{
public:
   CExec(string str) { m_str = str; };
   void Print() { cout << m_str.c_str() << endl; }
private:
   string m_str;
};

CSubClassOne, CSubClassTwoCSubClassThree 클래스
class CSubClassOne
{
public:
   void Exec() {
      auto_ptr<CExec> pExec(new CExec("Sub Class One"));
      pExec->Print();
   };
};

class CSubClassTwo
{
public:
   void Exec() {
      auto_ptr<CExec> pExec(new CExec("Sub Class Two"));
      pExec->Print();
   };
};

class CSubClassThree
{
public:
   void Exec() {
      auto_ptr<CExec> pExec(new CExec("Sub Class Three"));
      pExec->Print();
   };
};

CFacade 클래스
class CFacade
{
public:
   CFacade() {
      m_pSubClassOne = new CSubClassOne();
      m_pSubClassTwo = new CSubClassTwo();
      m_pSubClassThree = new CSubClassThree();
   };

   ~CFacade() {
      delete m_pSubClassOne;
      delete m_pSubClassTwo;
      delete m_pSubClassThree;
   };

   
   void ExecOne() {
      m_pSubClassOne->Exec();
      m_pSubClassTwo->Exec();
   };

   void ExecTwo() {
      m_pSubClassThree->Exec();
   }

private:
   CSubClassOne* m_pSubClassOne;
   CSubClassTwo* m_pSubClassTwo;
   CSubClassThree* m_pSubClassThree;
};

실행부분
void main()
{
   auto_ptr<CFacade> pFacade(new CFacade());
   pFacade->ExecOne();
   pFacade->ExecTwo();
}

UML - class 다이어그램

참고
  • GoF의 디자인 패턴(개정판) 재사용성을 지닌 객체지향 소프트웨어의 핵심요소
  • http://wooriworld2006.tistory.com/336
  • http://blog.naver.com/ruly2001/70072957308

댓글 없음:

댓글 쓰기

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