본문 바로가기
객체 지향 프로그래밍/디자인 패턴

[구조 패턴] 퍼사드 패턴 (Façade Pattern) 이란?

by xangmin 2022. 5. 30.
반응형

퍼사드 패턴 이란?

• Façade는 ‘건물의 정면’, ‘건물의 외관’의 뜻으로 건물 외벽에서 보면 안의 구조는 보이지 않음

    -많은 서브 시스템(내부 구조)거대한 클래스(외벽)으로 감싸서 편리한 인터페이스 제공

• 서브시스템에 있는 인터페이스들에 대한 통합된 인터페이스를 제공

• 서브시스템을 더 쉽게 사용할 수 있도록 만드는 더 높은 수준의 인터페이스를 제공

 

 

퍼사드 패턴 구조

Façade System 클래스를 사용하여 Client 클래스에서 사용할 인터페이스를 구현
System 특정 목적을 위한 여러 개의 클래스 존재
Client Façade 클래스를 통해 System 클래스에 접근 가능

 

사용 예시

영화관에서 영화를 상영하고 있는 시스템이 있다고 가정하고영화를 상영하기 위한 필요한 절차는 아래와 같다.

   (1) 조명을 영화관 모드로 변경

   (2) 스크린을 내림

   (3) 프로젝터를 킴

   (4) 프로젝트를 영화관 모드로 변경

 (5) DVD Player를 킴  (6) DVD Player에서 영화를 시작

• 위의 모든 과정을 수행하기 위해서는 조명, 프로젝터, 스크린, DVD Player 객체를 모두 알고 있어야 한다.

• 클라이언트가 모든 객체를 알고 있으면 결합도가 상당히 높고 복잡해진다.

• 퍼사드 패턴을 이용하여 클라이언트는 퍼사드 객체 하나만으로 영화를 상영할 수 있게 구현할 수 있다.

 
public class Light {

    public void on() {
        System.out.println("조명 킵니다.");
    }

    public void movieMode() {
        System.out.println("조명 : 영화관 모드");
    }
}

public class Screen {

    public void down() {
        System.out.println("스크린을 내립니다.");
    }

    public void up() {
        System.out.println("스크린을 올립니다.");
    }
}

public class Projector {

    public void on() {
        System.out.println("Projector를 킵니다.");
    }

    public void off() {
        System.out.println("Projector를 끕니다.");
    }

    public void movieMode() {
        System.out.println("Projector : 영화관모드");
    }
}

public class DvdPlayer {

    public void on() {
        System.out.println("DvdPlayer를 킵니다.");
    }

    public void play(String movieName) {
        System.out.println(movieName + "를 시작합니다.");
    }

    public void off() {
        System.out.println("DvcPlayer를 끕니다.");
    }
}

public class HomeTheaterFacade {

    Light light;
    Projector projector;
    Screen screen;
    DvdPlayer dvdPlayer;

    public HomeTheaterFacade(Light light, Projector 
       projector, Screen screen, DvdPlayer dvdPlayer) {

        this.light = light;
        this.projector = projector;
        this.screen = screen;
        this.dvdPlayer = dvdPlayer;
    }

    public void watchMovie(String movieName) {
        System.out.println("=====WATCH MOIVE=====");
        light.movieMode();
        screen.down();
        projector.on();
        projector.movieMode();
        dvdPlayer.on();
        dvdPlayer.play(movieName);
    }

    public void endMovie() {
        System.out.println("=====END MOIVE=====");
        light.on();
        screen.up();
        projector.off();
        dvdPlayer.off();
    }
}
public class Client {
    public static void main(String[] args) {
        HomeTheaterFacade homeTheaterFacade =
      new HomeTheaterFacade(new Light(), new Projector(),
                       new Screen(), new DvdPlayer());

        homeTheaterFacade.watchMovie("조커");
        homeTheaterFacade.endMovie();
    }
}

실행결과

=====WATCH MOIVE=====
조명 : 영화관모드
스크린을 내립니다.
Projector를 킵니다.
Projector : 영화관모드
DvdPlayer를 킵니다.
조커를 시작합니다.
=====END MOIVE=====
조명 킵니다.
스크린을 올립니다.
Projector를 끕니다.
DvcPlayer를 끕니다.
반응형

댓글