퍼사드 패턴 (Facade Pattern)
Facade는 "건물의 정면"을 의미하는 단어로 어떤 소프트웨어의 다른 커다란 코드 부분에 대하여 간략화된 인터페이스를 제공해주는 디자인 패턴을 의미합니다. 퍼사드 객체는 복잡한 소프트웨어 바깥쪽의 코드가 라이브러리의 안쪽 코드에 의존하는 일을 감소시켜 주고, 복잡한 소프트웨어를 사용 할 수 있게 간단한 인터페이스를 제공해줍니다.
동기
어떤 사람이 영화를 보고자 합니다. 영화를 보기 위해서는 다음과 같은 과정을 거치게 됩니다. 음료를 준비한다 -> TV를 켠다 -> 영화를 검색한다 -> 영화를 결제한다 -> 영화를 재생한다.
public void view()
{
Beverage beverage = new Beverage("콜라");
Remote_Control remote= new Remote_Control();
Movie movie = new Movie("어벤져스");
beverage.Prepare(); //음료 준비
remote.Turn_On(); //tv를 켜다
movie.Search_Movie(); //영화를 찾다
movie.Charge_Movie(); // 영화를 결제하다
movie.play_Movie(); //영화를 재생하다
}
사용자 입장에서는 영화를 보기위해서는 저런 복잡한 코드를 사용하여 영화를 봐야만 합니다. 여기서 퍼사드 객체가 등장하게 되는데 퍼사드는 이런 사용자와 영화를 보기위해 사용하는 서브 클래스들 사이의 간단한 통합 인터페이스를 제공해주는 역할을 하게 됩니다.
퍼사드 패턴의 구조
https://t1.daumcdn.net/cfile/tistory/99294A3359C9DBBE33
Client 입장에서는 Facde 객체에서 제공하는 doSomething() 메서드를 호출함으로써 복잡한 서브 클래스의 사용을 도와주고 있습니다.
예제
위에 동기 부분에서 사용한 예제를 Facade 객체를 추가한 형태와 더불어 전체 소스를 살펴 보겠습니다.
Remote_Control.java
public class Remote_Control {
public void Turn_On(){
System.out.println("TV를 켜다");
}
public void Turn_Off(){
System.out.println("TV를 끄다");
}
}
리모컨을 조작하는 클래스입니다. 복잡한 서브 클래스들중 하나입니다.
Movie.java
public class Movie {
private String name="";
public Movie(String name) {
this.name = name;
}
public void Search_Movie() {
System.out.println(name+" 영화를 찾다");
}
public void Charge_Movie() {
System.out.println("영화를 결제하다");
}
public void play_Movie() {
System.out.println("영화 재생");
}
}
영화 재생과 관련된 클래스입니다. 마찬가지로 복잡한 서브 클래스들중 하나입니다.
Beveragejava
public class Beverage {
private String name="";
public Beverage(String name) {
this.name = name;
}
public void Prepare() {
System.out.println(name+" 음료 준비 완료 ");
}
}
음료를 제공하는 클래스입니다. 복잡한 서브 클래스들중 하나입니다.
Facade.java
public class Facade {
private String beverage_Name ="";
private String Movie_Name="";
public Facade(String beverage,String Movie_Name) {
this.beverage_Name=beverage_Name;
this.Movie_Name=Movie_Name;
}
public void view_Movie() {
Beverage beverage = new Beverage(beverage_Name);
Remote_Control remote= new Remote_Control();
Movie movie = new Movie(Movie_Name);
beverage.Prepare();
remote.Turn_On();
movie.Search_Movie();
movie.Charge_Movie();
movie.play_Movie();
}
}
다음은 가장 중요한 Facade 클래스입니다. 복잡한 서브 클래스들에 대한 인스턴스를 가지며 복잡한 호출 방식에 대하여 view_Movie() 메서드내에서 구현을 하도록 하였습니다.
public class Facade {
public void view() {
Facade facade = new Facade("콜라","어벤져스");
facade.view_Movie();
}
사용자 입장에서는 이제 서브 클래스에 대해서 알 필요가 없습니다. 단지 Facde 객체의 view_Movie() 메서드를 호출하면서 서브 클래스들의 복잡한 기능을 수행 할 수 있기 떄문입니다.