1. 퍼사드 패턴이란

1.1 퍼사드 패턴의 정의

어떤 서브시스템의 일련의 인터페이스에 대해 통합된 인터페이스를 제공하는 패턴.

고수준의 인터페이스를 정의하여 서브시스템을 더 쉽게 사용가능하게 함.


퍼사드 패턴은 인터페이스를 단순화시키기 위해서 사용된다.


어떤 작업을 하기 위해서 다수의 인터페이스로 구성된 서브시스템을 사용해야 할 때, 그 서브시스템을 사용하기 쉽게 포괄적인 인터페이스를 정의하는 패턴이다.


여기서 말하는 서브시스템은 실제 구현에서는 표현되지 않았을 수 있고, 전체 시스템 중의 일부분을 묶어서 서브시스템이라고 표현하는 것이다.


UML만으로 설명하면 더 헷갈릴 수 있을 것 같아서 바로 예제로 넘어가도록 하겠다.


2. 예제


Head First Desgin Pattern에 나오는 예제를 수정한 것이다.


한참동안 준비하여 DVD 플레이어, 프로젝터, 자동 스크린, 앰프 오디오, 팝콘기계, 라디오 등을 집에 배치했다.

이를 클래스 다이어그램을 표현하면 다음과 같다.



이제 이 장비들을 이용해 영화를 보고자 한다.

영화를 보려면 몇 가지 일들을 해야한다.


  1. 팝콘 기계를 켠다.

  2. 팝콘를 튀긴다

  3. 프로젝터를 켠다.

  4. 프로젝터에 DVD 신호가 입력되게 연결한다.

  5. 프로젝터를 와이드 스크린 모드로 전환한다.

  6. 앰프 오디오를 켠다.

  7. 앰프를 서라운드 음향 모드로 전환한다.

  8. 앰프 볼륨을 중간(5)로 설정한다.

  9. DVD 플레이어를 켠다.

  10. DVD를 재생한다.


이 작업을 하기 위해서 필요한 코드를 보자.


popcornPopper->on(); popcornPopper->pop(); projector->on(); projector->wideScreenMode(); amplifier->on(); amplifier->setDvd(this->dvdPlayer); amplifier->setSurroundSound(); amplifier->setVolume(5); dvdPlayer->on();


굉장히 복잡하다.

여기서 끝이 아니라 영화가 끝나고 나면 모든 장비들을 특정 순서대로 꺼야하고, 라디오를 들을 때도 복잡한 과정을 거쳐야한다.


퍼사드 패턴을 적용하면 클라이언트 측에서는 이런 복잡한 과정들을 거치지 않아도 된다.

퍼사드 패턴을 적용하면 어떻게 되는지 보자.



HomeTheaterFacade 클래스가 추가되었다.

이제 영화를 보고, 영화 보기를 끝내는 일련의 작업은 HomeTheaterFacade 클래스에서 처리하고, 클라이언트들은 이 클래스 객체에 대한 레퍼런스를 얻어 watchMoive(), endMovie() 메소드를 호출하면 된다.


watchMoive() 메소드와 endMovie() 메소드는 다음과 같이 구현된다.


//HomeTheaterFacade.cpp


void HomeTheaterFacade::watchMovie() { cout << "영화보기 모드 실행" << endl; this->popcornPopper->on(); this->popcornPopper->pop(); this->projector->on(); this->projector->wideScreenMode(); this->amplifier->on(); this->amplifier->setDvd(this->dvdPlayer); this->amplifier->setSurroundSound(); this->amplifier->setVolume(5); this->dvdPlayer->on(); this->dvdPlayer->off(); } void HomeTheaterFacade::endMovie() { cout << "영화 끄기" << endl; this->popcornPopper->off(); this->screen->up(); this->projector->off(); this->amplifier->off(); this->dvdPlayer->stop(); this->dvdPlayer->eject(); this->dvdPlayer->off(); }



구현된 프로젝트는 다음의 깃허브 페이지에서 확인 할 수 있다.

(https://github.com/InvincibleTyphoon/FacadePatternExample/tree/master)


3. 퍼사드 패턴의 장점


- 서브시스템의 복잡한 인터페이스를 단순화된 하나의 인터페이스로 묶을 수 있음

- 클라이언트 구현과 서브시스템을 분리 할 수 있음

- 서브시스템을 캡슐화하지 않기 때문에 서브시스템의 클래스에 직접 접근하여 저수준 기능도 그대로 이용 할 수 있음


퍼사드 패턴을 이용하면 복잡한 서브시스템을 하나의 인터페이스로 묶을 수 있다.


클라이언트의 구현과 서브시스템이 분리되기 때문에 서브시스템의 구현에 변화가 생겨도 클라이언트 코드는 수정하지 않아도 된다.


퍼사드 클래스로 간단하게 원하는 작업을 수행 할 수 있고, 퍼사드 패턴을 무시하고 서브시스템을 구성하는 클래스들을 그대로 사용 할 수도 있다.

퍼사드 클래스를 적용해도 원래의 시스템에서 아무런 제약이 추가되지 않는 것이다.


4. 레퍼런스

- Head First Design Pattern(O'REILLY media)

- GoF의 디자인 패턴(Pearson Addison Wesley)


블로그 이미지

서기리보이

,