퍼사드(Façade)
란 프랑스어로 건물의 출입 외벽을 의미합니다.아래 그림처럼 건물 외관에 대한 디자인을 의미합니다. 이처럼 퍼사드 패턴은 건물 외벽으로 전체를 간략하게 나타내주는 패턴입니다.
퍼사드 패턴
은 어떤 객체에 대해 서브 시스템들의 통합된 인터페이스를 제공하는 패턴입니다. 퍼사드를 이용해서 서브 시스템에 쉽게 접근할 수 있게됩니다. 다시말하자면, 통합된 인터페이스 서브 시스템에 대해 쉬운 접근을 하게 해주는 패턴이 퍼사드 패턴
입니다. 퍼사드 패턴
은 구조 패턴으로 분류됩니다.
최소 지식 원칙
은 정말 가까운 친구 사이에서만 상호작용을 허용한다는 원칙입니다. 이 원칙은 객체를 만들면 그 객체와 상호작용을 하게될 클래스의 수와 방식에 주의를 기울여야 합니다. 그러니까 객체들 끼리 복잡하게 얽혀서 보수과정에서 이 객체 저 객체 고치는 것을 지양하기 위한 원칙이죠.
그렇다면 이 최소 지식 원칙을 지키기 위해서는 어떻게 하는 것이 좋을까요. 바로 다음 네 종류의 객체 메소드만을 호출하면 됩니다.
퍼사드 패턴
은 서브 시스템에 대해서 통합된 인터페이스를 지원한다고 했었습니다. 퍼사드 패턴
을 설계할 때는 이 원칙들을 기억하며 패턴을 설계해야합니다.자동차가 있습니다. 자동차에는 수많은 기능들이 있죠. 라디오, 네이게이션, 창문 제어, 시동 제어 등 수많은 기능이 있습니다.
public class MediaPlayer {
public void mediaPlayerOn(){
System.out.println("미디어 재생");
}
public void mediaPlayerOff() {
System.out.println("미디어 종료");
}
}
public class Engine {
public void engineOn(){
System.out.println("시동 걸기");
}
public void engineOff(){
System.out.println("시동 끄기");
}
}
public class WindowControl {
public void windowOpen() {
System.out.println("창문 열기");
}
public void windowClose(){
System.out.println("창문 닫기");
}
}
만약 이렇게 구성되어있다고 할 때 퍼사드 패턴을 이용하지 않는다면, 이 메소드들을 이용하려면 다음과 같이 해야할 것입니다.
MediaPlayer mediaPlayer = new MediaPlayer();
Engine engine = new Engine();
WindowControl windowControl = new WindowControl();
engine.engineOn();
mediaPlayer.mediaPlayerOn();
windowControl.windowOpen();
engine.engineOff();
보다시피 각 객체를 만든 뒤에 직접 기능을 불러와서 실행시키게됩니다. 기능이 많아지면 많아질수록 코드는 길어지고 복잡해지겠죠. 그래서 우리는 여기에 퍼사드 패턴을 입혀서 하나의 편리한 클래스를 만들 것 입니다.
public class CarFacade {
MediaPlayer mediaPlayer = new MediaPlayer();
Engine engine = new Engine();
WindowControl windowControl = new WindowControl();
public void turnOnAllSystem(){
engine.engineOn();
mediaPlayer.mediaPlayerOn();
windowControl.windowOpen();
}
public void turnOffAllSystem(){
windowControl.windowClose();
mediaPlayer.mediaPlayerOff();
engine.engineOff();
}
}
이처럼 한 클래스에 모든 기능들을 몰아 넣어서, 실제로 사용할 클래스에선 간단한 호출로 사용할 수 있게 되었습니다.
public class FacadeMain {
public static void main(String[] args) {
CarFacade car = new CarFacade();
car.turnOnAllSystem();
car.turnOffAllSystem();
}
}
결과적으로 보면 사용하지 않았을 때랑 큰 차이가 없는 것 같지만, 퍼사드 패턴은 서브 시스템의 편리한 사용을 제공한다는 패턴임을 생각해 본다면 굉장한 편의성을 제공하고 있습니다.