퍼사드 패턴은 어떤 소프트웨어의 다른 커다란 코드 부분에 대하여 간략화된 인터페이스를 제공해주는 디자인 패턴을 의미한다. 퍼사드 객체는 복잡한 소프트웨어 바깥쪽의 코드가 라이브러리의 안쪽 코드에 의존하는 일을 감소시켜 주고, 복잡한 소프트웨어를 사용 할 수 있게 간단한 인터페이스를 제공해준다.
집에서 영화를 본다고 생각해보면 영화를 보기위해서는 여러가지 과정이 필요하다.
1. 조명을 조절한다
2. 스크린을 내린다
3. 프로젝터를 켠다.
4. 앰프를 켠다.
5. 스트리밍 플레이어를 켠다.
6. 영화를 재생한다
이런 일련의 과정을 거쳐 영화를 보게된다.
이렇게 복잡한 과정을 쓰기 쉬운 인터페이스를 제공하는 퍼사드 클래스를 구현함으로써 복잡한 시스템을 훨씬 편하게 사용할 수 있다.
예시)
public class HomeTeaterFacade {
Amplifier amp;
Tuner tuner;
StreamingPlayer player;
Projector projector;
TeaterLights lights;
Screen screen;
public HomeTeaterFacade(Amplifier amp, Tuner tuner, StreamingPlayer player, Projector projector, TeaterLights lights, Screen screen) {
this.amp = amp;
this.tuner = tuner;
this.player = player;
this.projector = projector;
this.lights = lights;
this.screen = screen;
}
//기타 메소드
public void watchMovie(String movie){
System.out.println("영화 볼 준비중");
lights.dim(10);
screen.down();
projector.on();
projector.wideScreenMode();
amp.on();
amp.setStreamingPlayer(player);
amp.setSurroundSound();
amp.setVolume(5);
player.on();
player.play(movie);
}
}
이렇게 서브시스템에 속한 일련의 복잡한 클래스를 단순하게 바꿔서 통합한 클래스를 만든다. 퍼사드 패턴을 사용하면 클라이언트와 서브시스템이 서로 긴밀하게 연결되지 않아도 된다. "최소 지식 원칙"을 준수하는데도 도움이 된다.
객체 사이의 상호작용은 될 수 있으면 아주 가까운 '친구'사이에서만 허용하는 편이 좋다.
4개의 가이드라인
원칙을 따르지 않은 경우
public float getTemp(){
Thermometer thermometer = station.getThermometer();
return thermometer.getTemperature();
}
// -> station으로부터 thermometer객체를 받은다음
//그 객체의 getTemperature()메소드를 직접 호출한다
원칙을 따르는 경우
public float getTemp(){
return station.getTemperature();
}
// -> 최소 지식 원칙을 적용해서 thermometer에게
// 요청을 전달하는 메소드를 station클래스에 추가했다.
// 이러면 의존해야 하는 클래스의 개수를 줄일 수 있다.
