일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 카카오톡1차
- 알고리즘
- Head First Design Pattern
- 인코딩
- 후기
- 자바
- Java
- 람다
- Design Pattern
- 매핑
- 오라클
- Oracle
- 독서
- Eclipse
- 공부
- 인강리뷰
- JPA
- 이펙티브자바
- javascript
- spring
- study
- 우아한테크코스
- 독서리뷰
- 에러
- math
- 회고
- 프로그래머스
- Singleton
- 인프런
- 디자인패턴
- Today
- Total
Lee's Grow up
[디자인패턴/Design Pattern] Facade Pattern / 퍼사드 패턴 본문
관련 내용은 [자바 언어로 배우는 디자인 패턴 입문]
,[Head First Design Pattern]
의 내용을 참고해서 정리한 내용입니다. 잘못된 부분은 댓글로 피드백 부탁드립니다.
1. Facade 패턴이란?
어떤 서브시스템의 일련의 인터페이스에 대한 통합된 인터페이스를 제공합니다. 즉, 서브시스템들을 사용하기 쉽게 통합해주는 역할을 합니다.
2. Facade 패턴의 등장인물
Facade(정면)의 역할
수만은 서브기능들에 대한 '창구'가 됩니다. 높은 레벨에서 단순한 인터페이스(API)를 외부에 제공합니다.
Facade 패턴의 클래스 다이어그램
3. 예제
여러분들이 집에서 영화를 보려고 자동화 시스템을 만들기로 합니다. 이때 준비해야할 목록들을 생각해봅니다.
- 팝콘 또는 간식 준비
- 음료 준비
- 스크린 내리기
- 엠프 준비
- 빔프로젝터 가동
- 기타 등등등..
위 예시와 같이 영화를 보기 위해서 복잡한 서브시스템들을 동작해야 합니다.
public static void main(String[] args) {
Screen screen = new Screen();
screen.down();
new Projector projector = new Projector();
projector.on();
// 등등 기타 필요한 서브프로그램 동작
}
위와 같이 동작한다고 가정했을 경우 영화가 끝나고 각종 서브 시스템들을 종료해야 할 경우, 위와 같은 과정의 반대과정을 또 수행해야 할까요? 서브 시스템에 수정이 생기면 클라이언트는 또 다른 수정이 필요하게 됩니다.
이와 같은 문제에서 Facade
패턴을 사용합니다.
4. 해결방법
위와 같은 문제를 해결하는 방법은 간단합니다. 서브시스템들의 사용을 정의한 인터페이스(API) 클래스를 하나 만들어주고, 클라이언트는 해당 클래스를 통해서 영화를 볼 수 있게 설계하면 됩니다.
4-1. HomeTheaterFacade 클래스 ( API )
public class HomeTheaterFacade {
DvdPlayer dvd;
Projector projector;
Screen screen;
Amplifier amp;
public HomeTheaterFacade(DvdPlayer dvd, Projector projector, Screen screen, Amplifier amp) {
super();
this.dvd = dvd;
this.projector = projector;
this.screen = screen;
this.amp = amp;
}
public void watchMovie(String movie) {
System.out.println(movie +" 영화를 보기 위한 준비중입니다.");
screen.down();
projector.on();
amp.on();
dvd.on();
dvd.play(movie);
}
}
위와 같이 서브 시스템의 사용을 정의합니다. 만약 추가 기능이 필요하면 메소드를 추가해주면 되고, 수정이 발생할 경우 클라이언트쪽 소스가 아닌 해당 클래스의 수정이 있으면 됩니다.
4-2. Main 클래스
public class Main {
public static void main(String[] args) {
HomeTheaterFacade homeTheatherFacade = new HomeTheaterFacade(
new DvdPlayer(),new Projector(), new Screen(), new Amplifier());
homeTheatherFacade.watchMovie("The Thirteenth Floor( 13층 )");
}
}
4-3. 실행 결과
The Thirteenth Floor( 13층 ) 영화를 보기 위한 준비중입니다.
스크린을 내립니다.
프로젝터 실행
엠프 동작
DVD 인식 완료
------The Thirteenth Floor( 13층 ) 내용 -------
4-4 왜 사용할까?
- 사용 예제와 같이 클라이언트는 복잡한 서비스시템의 동작을 관리하지 않아도 됩니다.
- 즉 단순화된 인터페이스를 통해서 서브시스템을 더 쉽게 사용할 수 있도록 하기 위해 사용
- 서비시스템에 변경이 있어도 클라이언트의 수정은 필요가 없다.
5. 관련 패턴
Abstract Factory
패턴 : 오브젝트 생성이라는 복잡한 작업을Facade
패턴으로 간주할 수 있습니다. linkSingleton
패턴 :Facade
는 싱글톤으로 만들어지는 경우가 있습니다. linkMediator
패턴 :Facade
는 단방향이지만, 해당 패턴은 양방향으로, 중개자역할을 합니다.
6. 비교하기
디자인 패턴을 배우다 보니까 Adapter
, Decorator
, Facade
가 얼핏 보면 비슷하다고 느낌이 들어서 차이점을 정리합니다.
'PROGRAMMING > 디자인패턴' 카테고리의 다른 글
[디자인패턴/Design Pattern] State Pattern / 스태이트 패턴 (0) | 2019.12.17 |
---|---|
[디자인패턴/Design Pattern] Composite Pattern / 컴포지트 패턴 (0) | 2019.12.17 |
[디자인패턴/Design Pattern] Decorator Pattern / 데코레이터 패턴 (0) | 2019.12.12 |
[디자인패턴/Design Pattern] Observer 패턴 / 관찰자 패턴 / Publish-Subscribe 패턴 (0) | 2019.12.11 |
[디자인패턴/Design Pattern] Strategy 패턴 / 전략 패턴 (0) | 2019.12.11 |