Lee's Grow up

[디자인패턴/Design Pattern] Facade Pattern / 퍼사드 패턴 본문

PROGRAMMING/디자인패턴

[디자인패턴/Design Pattern] Facade Pattern / 퍼사드 패턴

효기로그 2019. 12. 16. 15:58
반응형

관련 내용은 [자바 언어로 배우는 디자인 패턴 입문],[Head First Design Pattern]의 내용을 참고해서 정리한 내용입니다. 잘못된 부분은 댓글로 피드백 부탁드립니다.

1. Facade 패턴이란?


어떤 서브시스템의 일련의 인터페이스에 대한 통합된 인터페이스를 제공합니다. 즉, 서브시스템들을 사용하기 쉽게 통합해주는 역할을 합니다.

2. Facade 패턴의 등장인물


  • Facade(정면)의 역할

    1. 수만은 서브기능들에 대한 '창구'가 됩니다. 높은 레벨에서 단순한 인터페이스(API)를 외부에 제공합니다.

      Facade 패턴의 클래스 다이어그램

3. 예제


여러분들이 집에서 영화를 보려고 자동화 시스템을 만들기로 합니다. 이때 준비해야할 목록들을 생각해봅니다.

  1. 팝콘 또는 간식 준비
  2. 음료 준비
  3. 스크린 내리기
  4. 엠프 준비
  5. 빔프로젝터 가동
  6. 기타 등등등..

위 예시와 같이 영화를 보기 위해서 복잡한 서브시스템들을 동작해야 합니다.

public static void main(String[] args) {
        Screen screen = new Screen();
        screen.down();

        new Projector projector = new Projector();
        projector.on();

        // 등등 기타 필요한 서브프로그램 동작
    }

위와 같이 동작한다고 가정했을 경우 영화가 끝나고 각종 서브 시스템들을 종료해야 할 경우, 위와 같은 과정의 반대과정을 또 수행해야 할까요? 서브 시스템에 수정이 생기면 클라이언트는 또 다른 수정이 필요하게 됩니다.
이와 같은 문제에서 Facade 패턴을 사용합니다.

4. 해결방법


위와 같은 문제를 해결하는 방법은 간단합니다. 서브시스템들의 사용을 정의한 인터페이스(API) 클래스를 하나 만들어주고, 클라이언트는 해당 클래스를 통해서 영화를 볼 수 있게 설계하면 됩니다.

4-1. HomeTheaterFacade 클래스 ( API )
public class HomeTheaterFacade {
    DvdPlayer dvd;
    Projector projector;
    Screen screen;
    Amplifier amp;

    public HomeTheaterFacade(DvdPlayer dvd, Projector projector, Screen screen, Amplifier amp) {
        super();
        this.dvd = dvd;
        this.projector = projector;
        this.screen = screen;
        this.amp = amp;
    }

    public void watchMovie(String movie) {
        System.out.println(movie +" 영화를 보기 위한 준비중입니다.");
        screen.down();
        projector.on();
        amp.on();
        dvd.on();
        dvd.play(movie);

    }
}

위와 같이 서브 시스템의 사용을 정의합니다. 만약 추가 기능이 필요하면 메소드를 추가해주면 되고, 수정이 발생할 경우 클라이언트쪽 소스가 아닌 해당 클래스의 수정이 있으면 됩니다.

4-2. Main 클래스
public class Main {
    public static void main(String[] args) {
        HomeTheaterFacade homeTheatherFacade = new HomeTheaterFacade(
                new DvdPlayer(),new Projector(), new Screen(), new Amplifier());

        homeTheatherFacade.watchMovie("The Thirteenth Floor( 13층 )");
    }
}
4-3. 실행 결과
The Thirteenth Floor( 13층 ) 영화를 보기 위한 준비중입니다.
스크린을 내립니다.
프로젝터 실행
엠프 동작
DVD 인식 완료
------The Thirteenth Floor( 13층 ) 내용 -------
4-4 왜 사용할까?
  • 사용 예제와 같이 클라이언트는 복잡한 서비스시템의 동작을 관리하지 않아도 됩니다.
    • 즉 단순화된 인터페이스를 통해서 서브시스템을 더 쉽게 사용할 수 있도록 하기 위해 사용
  • 서비시스템에 변경이 있어도 클라이언트의 수정은 필요가 없다.

5. 관련 패턴


  • Abstract Factory 패턴 : 오브젝트 생성이라는 복잡한 작업을 Facade 패턴으로 간주할 수 있습니다. link
  • Singleton 패턴 : Facade는 싱글톤으로 만들어지는 경우가 있습니다. link
  • Mediator패턴 :Facade는 단방향이지만, 해당 패턴은 양방향으로, 중개자역할을 합니다.

6. 비교하기


디자인 패턴을 배우다 보니까 Adapter , Decorator, Facade 가 얼핏 보면 비슷하다고 느낌이 들어서 차이점을 정리합니다.

  • Adapter : 관계가 없는 인터페이스(API)를 연결할 때 사용, 호환성 link
  • Decorator : 인터페이스(API)를 바꾸지 않고 기능을 추가. 확장성 link
  • Facade : 인터페이스(API)를 간편하게 사용. 간편함 link
반응형
Comments