ios dev kangwook.

09. Facade Pattern 본문

Design Pattern

09. Facade Pattern

kangwook 2022. 8. 27. 00:11

어떤 소프트웨어의 다른 커다란 코드 부분에 대하여 간략화된 인터페이스를 제공해주는 디자인 패턴

Facade Pattern

Facade Pattern은 하위 시스템의 인터페이스 집합에 통일된 인터페이스를 제공한다. 즉, Facade Pattern은 하위 시스템을 더 쉽게 사용할 수 있는 더 높은 수준의 인터페이스를 정의하는 패턴이다.

  • 다양한 서브시스템이 함께 이용되는 시스템에서 facade 클래스는 이 서브 시스템들을 추상화할 수 있음
  • Client는 서브시스템의 존재를 모르고 facade 클래스만 알고 있으며 facade 클래스에만 접근 할 수 있음
  • Client와 서브시스템은 의존성이 제거됨

Facade Pattern 예제

  • 홈씨어터를 Client가 사용하는 예제

  • 기존의 클래스들은 위와 같이 각 장치들이 여러 관계에 의해 복잡하게 구성되어 있음
  • 홈시어터의 사용법이 굉장히 복잡해질 수 있음

  • HomeTheaterFacade 클래스에서 subsystem으로의 쓰기 쉬운 인텉페이스를 만듦
public class HomeTheaterFacade {
    Amplifier amp;
    Tuner tuner;
    DvdPlayer dvd;
    CdPlayer cd;
    Projector projector;
    TheaterLights lights
    Screen screen;
    PopcornPopper popper;
 
    public HomeTheaterFacade(Amplifier amp,
                                       Tuner tuner,
                                       DvdPlayer dvd,
                                       CdPlayer cd,
                                       Projector projector,
                                       Screen screen,
                                       TheaterLights lights,
                                       PopcornPopper popper) {
        this.amp = amp;
        this.tuner = tuner;
        this.dvd = dvd;
        this.cd = cd;
        this.projector = projector;
        this.screen = screen;
        this.lights = lights;
        this.popper = popper;
    }
 
    public void watchMovie(String movie) {
        System.out.println("Get ready to watch a movie...");
        popper.on();
        popper.pop();
        screen.down();
        projector.on();
        projector.wideScreenMode();
        amp.on();
        amp.setDvd(dvd);
        amp.setSurroundSound();
        amp.setVolume(5);
        dvd.on();
        dvd.play(movie);
    }
 
    public void endMovie() {
        System.out.println("Shutting movie theater down...");
        popper.off();
        lights.on();
        screen.up();
        projector.off();
        amp.off();
        dvd.stop();
        dvd.eject();
        dvd.off();
    }
    ...
}
  • Client가 Facade Pattern을 통해 서브시스템에 접근
    • 먼저 Facade 클래스 객체를 생성
    • 필요한 메서드를 호출
    • 영화를 시작하기 위해 단순화된 인터페이스를 통해서 접근할 수 있음
public class HomeTheaterTestDrive {
    public static void main(String [] args) {
        HomeTheaterFacade homeTheater = new HomeTheaterFacade(amp,
                                                              tuner,
                                                              dvd,
                                                              cd,
                                                              projector,
                                                              screen,
                                                              lights,
                                                              popper);
        homeTheater.watchMovie("Raiders of the Lost Ark");
        homeTheater.endMovie();
    }
}

결론

  • Facade Pattern은 하위 시스템을 더 쉽게 사용할 수 있도록 단순한 인터페이스를 제공함으로써 다양한 코드에 쉽게 접근할 수 있도록 하는 구조 패턴(Structural Pattern)
  • 장점
    • Client 입장에서 서브 시스템을 사용해야할 때 다루어야 할 객체의 수를 줄여줌
      → Client입장에서 더 간결하게 코드를 사용할 수 있게 해줌
    • Client와 서브시스템간의 결합도가 낮아짐
  • 단점
    • 다른 구성요소에 대한 메소드 호출을 하기 위해 wrapper클래스를 많이 만들어야할 수 있음
      → 시간과 비용 증가

 

 

 


본문은 Head First Design Pattern (2004) 를 참고하여 공부하고 작성하였음


 

'Design Pattern' 카테고리의 다른 글

11. Iterator Pattern  (0) 2022.08.31
10. Template Method Pattern  (0) 2022.08.29
08. Adapter Pattern  (0) 2022.08.23
07. Command Pattern  (0) 2022.08.22
06. Singleton Pattern  (0) 2022.08.21
Comments