어떤 소프트웨어의 다른 커다란 코드 부분에 대하여 간략화된 인터페이스를 제공해주는 디자인 패턴이다.
⭐디자인 원칙: 정말 관련있는 객체와만 관계를 맺어라 (최소 지식 원칙)
Facade
Subsystem
Client
홈 씨어터
서브시스템이 많고 복잡함
-> 홈 씨어터 구성요소들을 하나의 서브시스템으로 간주함
-> 영화보기 기능
에서 서브시스템의 메소드들을 호출하여 필요한 작업을 처리
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();
}
}