2020. 4. 3. 16:15ㆍ디자인 패턴
1. Facade Pattern란
Facade Pattern은 어떤 소프트웨어의 다른 커다란 코드 부분에 대하여 단순화된 인터페이스를 제공해주는 디자인 패턴을 의미합니다. Facade Pattern은 단순화된 인터페이스를 통해 서브 시스템을 더 쉽게 사용할 수 있도록 하기 위한 용도로 사용됩니다. Facade 객체는 복잡한 소프트웨어 바깥쪽의 코드가 라이브러리의 안쪽 코드에 의존하는 일을 감소시켜 주고, 복잡한 소프트웨어를 사용할 수 있게 간단한 인터페이스를 제공해줍니다.
예시
어떤 사람이 영화를 보고자 합니다. 영화를 보기 위해서는 다음과 같은 과정을 거치게 됩니다.
음료를 준비한다 > TV를 켠다 > 영화를 검색한다 > 영화를 결제한다 > 영화를 재생한다
public void view()
{
Beverage beverage = new Beverage("콜라");
RemoteControl remote= new RemoteControl();
Movie movie = new Movie("어벤져스");
beverage.prepare(); //음료 준비
remote.turnOn(); //tv를 켜다
movie.searchMovie(); //영화를 찾다
movie.chargeMovie(); // 영화를 결제하다
movie.playMovie(); //영화를 재생하다
}
사용자 입장에서는 영화를 보기 위해 복잡한 코드를 사용하여 영화를 봐야만 합니다. 여기서 Facade 객체가 등장하는데 Facade는 이런 사용자가 영화를 보기 위해 사용하는 서브 클래스들 사이의 간단한 통합 인터페이스를 제공해주는 역할을 합니다.
2. Facade Pattern의 구조
Client 입장에서는 Facade 객체에서 제공하는 doSometihg() 메소드를 호출함으로써 복잡한 서브 클래스의 사용을 도와주고 있습니다.
예시
RemoteControl.java
public class RemoteControl {
public void turnOn()
{
System.out.println("TV를 켜다");
}
public void turnOff()
{
System.out.println("TV를 끄다");
}
}
Movie.java
public class Movie {
private String name="";
public Movie(String name)
{
this.name = name;
}
public void searchMovie()
{
System.out.println(name+" 영화를 찾다");
}
public void chargeMovie()
{
System.out.println("영화를 결제하다");
}
public void playMovie()
{
System.out.println("영화 재생");
}
}
Beverage.java
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 beverageName ="";
private String movieName="";
public Facade(String beverage,String movieName)
{
this.beverageName=beverageName;
this.movieName=movieName;
}
public void viewMovie()
{
Beverage beverage = new Beverage(beverageName);
Remote_Control remote= new RemoteControl();
Movie movie = new Movie(movieName);
beverage.prepare();
remote.turnOn();
movie.searchMovie();
movie.chargeMovie();
movie.playMovie();
}
public void view()
{
Facade facade = new Facade("콜라","어벤져스");
facade.viewMovie();
}
}
이렇게 하면 사용자 입장에서는 이제 서브클래스(Movie, RemoteControl, Beverage)에 대해서 알 필요가 없습니다. 단지 Facade 객체의 viewMovie() 메소드를 호출하면서 서브 클래스들의 복잡한 기능을 수행할 수 있기 때문입니다.
'디자인 패턴' 카테고리의 다른 글
Factory Pattern (0) | 2020.05.06 |
---|---|
Chain Of Responsibility (0) | 2020.05.02 |
Observer Pattern (0) | 2020.05.02 |
Template Method Pattern (0) | 2020.05.01 |
Singleton Pattern (0) | 2020.04.27 |