[Design Pattern] Facade Pattern

younghyun·2022년 10월 26일
0

Design Pattern

목록 보기
10/14
post-thumbnail

Facade Pattern 이란

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

  • 서브시스템 클래스들을 캡술화 하는 것은 아님. 기능을 편하게 사용할 수 있도록 인터페이스를 제공해 줄 뿐 (접근지정자가 default)
  • 서브시스템이 너무 많고 사용하기 복잡한 상황에서 사용하기 적합함
  • 최소 지식 원칙에 입각해 의존성 최소화해줌

⭐디자인 원칙: 정말 관련있는 객체와만 관계를 맺어라 (최소 지식 원칙)

  • 객체 자체
  • 메소드에 매개변수로 전달된 객체
  • 그 메소드에서 생성하거나 인스턴스를 만든 객체
  • 그 객체에 속하는 구성요소

설계

  • Facade
    : Client의 요청을 적절한 Subsystem에게 전달함
    • 어떤 Subsystem 클래스가 클라이언트의 요청에 응답해야 하는지 알고 있다
  • Subsystem
    : Subsystem 기능을 구현
    • Facade 객체에서 전달받은 요청을 처리한다
    • 서브 시스템 클래스들은 Facade 객체의 존재를 모른다
  • Client
    : 서브 시스템 객체를 직접 호출하는 대신 Facade를 사용함

예시

홈 씨어터

  • 시스템: DVD 플레이어, 프로젝터, 자동 스크린, 서라운드 음향 시스템, 팝콘 기계
  • 기능: 영화보기, 라디오 듣기
    • 영화보기 기능
      1. 팝콘 기계를 켜고 튀기기 시작
      2. 전등을 어둡게 조절, 스크린을 내림
      3. 프로젝터를 켜고 프로젝터로 DVD 신호 입력
      4. 프로젝터를 와이드 스크린 모드로 전환
      5. 앰프를 켜고 DVD로 전환
      6. 앰프를 서라운드 음향 모드로 전환
      7. 앰프 볼륨을 중간(5)로 설정
      8. DVD 플레이어를 켜고 재생 시작

1. Facade Pattern 활용

서브시스템이 많고 복잡함
-> 홈 씨어터 구성요소들을 하나의 서브시스템으로 간주함
-> 영화보기 기능에서 서브시스템의 메소드들을 호출하여 필요한 작업을 처리

2. 클래스 구성

3. 실제 구현

Facade

public class HomeTheaterFacade {
    private Amplifier amp;
    private Tuner tuner;
    private DvdPlayer dvd;
    private CdPlayer cd;
    private Projector projector;
    private TheaterLights lights;
    private Screen screen;
    private PopcornPopper popper;
    
    public HomeTheaterFacade(Amplifier a, Tuner t, DvdPlayer d, CdPlayer c, Projector p, Screen s, TheaterLights l, PopcornPopper pp) {
        this.amp = a; this.tuner = t; this.dvd = d; 
        this.cd = c; this.projector = p; this.lights = l; 
        this.screen = s; this.popper = pp;
    }
    
    // 영화보기 기능
    public void watchMovie(String movie) {
        System.out.println("Get ready to watch a movie...");
        popper.on();
        popper.pop();
        lights.dim(10);
        screen.down();
        projector.on();
        projector.wideScreenMode();
        amp.on();
        amp.setDvd(dvd);
        amp.setVolume(5);
        dvd.on();
        dvd.play(movie);
    }
    
    // 영화끄기 기능
    public void endMovie() {
        System.out.println("Shutting movie theater down...");
        projector.off();
        amp.off();
        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();
        }// 기타 메소드
    }
}

HomeTheater 사용

public class HomeTheaterTestDrive {

    public static void main(String[] args) {
    /* 컴포넌트 객체 (amp, tuner, dvd, cd, projector, screen, lights, popper) 생성 코드 구현 */
    HomeTheaterFacade homeTheater = new HomeTheaterFacade(amp, tuner, dvd, cd, projector, screen, lights, popper);
    homeTheater.watchMovie("Raiders of the Lost Ark");
    homeTheater.endMovie();
    }
}
profile
🌱 주니어 백엔드 개발자입니당

0개의 댓글