티스토리 뷰

728x90
반응형

파사드 패턴


  • 퍼사드 패턴은 복잡한 서브 시스템을 인터페이스로 감싸 간단하게 만드는 것입니다. 또한 제 3의 API같은 외부 라이브러리를 추상화 하는데도 사용이 됩니다.
  • Client는 서브 시스템의 존재를 모르고 오직 facade 클래스만 알고 있으며, facade 클래스만 접근할 수 있습니다. 이렇게 하면 클라이언트는 서브 시스템으로부터 분리되어 서브 시스템에 의존하지 않아도 되므로 느슨한 결합을 이룰 수 있습니다.

 

클래스 다이어 그램


Client
  • Facade에게 특정한 행동을 수행해달라고 요청합니다.
Facade
  • 클라이언트의 요청을 적절한 서브 시스템 클래스에 위임합니다.
Sub System Class
  • 서브 시스템 기능을 구현합니다. 서브 시스템 클래스는 facade에 의해서만 사용됩니다.

 

예시


영화 시청하기

간식 고르기 > Tv 켜기 > 영화 검색 > 영화 선택 > 영화 결제 > 영화 재생

 

Facade 패턴을 적용하지 않은 예제
  • Client에서 Snack, Tv, Movie 클래스를 활용하고 있으며, 해당 클래스와 결합도가 높은것을 볼 수 있습니다.
public class Snack {
    private String name;

    public Snack(String name) {
        this.name = name;
    }

    public void setSnack() {
        System.out.println(name + "과자를 준비합니다.");
    }
}

public class Tv {
    public void turnOn() {
        System.out.println("TV를 킵니다.");
    }

    public void turnOff() {
        System.out.println("TV를 끕니다.");
    }
}

public class Movie {
    private String name;

    public Movie(String name) {
        this.name = name;
    }

    public void searchMovie() {
        System.out.println(name + " 영화를 검색합니다.");
    }

    public void choiceMovie() {
        System.out.println("영화를 선택합니다.");
    }

    public void buyMovie() {
        System.out.println("영화를 결제합니다.");
    }

    public void playMovie() {
        System.out.println("영화를 시청합니다.");
    }
}
public class Client {
    public static void main(String[] args) {
        Snack snack = new Snack("오감자");
        Tv tv = new Tv();
        Movie movie = new Movie("스파이더맨");

        snack.setSnack();
        tv.turnOn();
        movie.searchMovie();
        movie.choiceMovie();
        movie.buyMovie();
        movie.playMovie();
    }
}

 

실행 결과

 

Facade 패턴을 적용한 예제

 

Facade 역할을 수행하는 클래스
public class Facade {
    private String snackName;
    private String movieName;

    public Facade(String snackName, String movieName) {
        this.snackName = snackName;
        this.movieName = movieName;
    }

    public void viewMovie() {
        Snack snack = new Snack(snackName);
        Tv tv = new Tv();
        Movie movie = new Movie(movieName);

        snack.setSnack();
        tv.turnOn();
        movie.searchMovie();
        movie.choiceMovie();
        movie.buyMovie();
        movie.playMovie();
    }
}

 

각각의 Sub System Class
public class Snack {
    private String name;

    public Snack(String name) {
        this.name = name;
    }

    public void setSnack() {
        System.out.println(name + "과자를 준비합니다.");
    }
}

public class Tv {
    public void turnOn() {
        System.out.println("TV를 킵니다.");
    }

    public void turnOff() {
        System.out.println("TV를 끕니다.");
    }
}

public class Movie {
    private String name;

    public Movie(String name) {
        this.name = name;
    }

    public void searchMovie() {
        System.out.println(name + " 영화를 검색합니다.");
    }

    public void choiceMovie() {
        System.out.println("영화를 선택합니다.");
    }

    public void buyMovie() {
        System.out.println("영화를 결제합니다.");
    }

    public void playMovie() {
        System.out.println("영화를 시청합니다.");
    }
}

 

Client
public class Client {
    public static void main(String[] args) {
        Facade facade = new Facade("오감자", "스파이더맨");
        facade.viewMovie();
    }
}

 

실행 결과

 

장점
  • 서브 클래스를 보호합니다.
    • 클라이언트가 서브 시스템의 구성 요소를 직접 호출하지 않으므로 잘못된 사용을 방지할 수 있습니다.
  • 확장성
  • 느슨한 결합
    • 직접적으로 서브 클래스에 접근하지 않고 인터페이스와 유사한 역할을 하는 파사드를 이용하여 서브 시스템에 접근할 수 있습니다.
  • 계층화
    • 서브 시스템이 계층화된 구조를 갖더라도 파사드는 계층 단계별로 접근하여 행위를 호출할 수 있습니다.
  • 이식성

 

728x90
반응형