티스토리 뷰
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
반응형
'JAVA > Design_Pattern' 카테고리의 다른 글
[Design_Pattern] 팩토리 메서드 패턴 (0) | 2022.07.27 |
---|---|
[Design_Pattern] 프록시 패턴 (0) | 2022.03.23 |
[Design_Pattern] 데코레이터 패턴 (0) | 2022.03.11 |
[Design_Pattern] 컴포지트 패턴 (0) | 2022.03.07 |
[Design_Pattern] 어댑터 패턴 (0) | 2022.03.05 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- redis sorted set
- 트랜잭셔널 아웃박스 패턴 스프링 부트 예제
- 공간 기반 아키텍처
- 트랜잭셔널 아웃박스 패턴 스프링부트
- spring boot redisson 분산락 구현
- spring boot redisson destributed lock
- spring boot 엑셀 다운로드
- spring boot poi excel download
- space based architecture
- 람다 표현식
- 레이어드 아키텍처란
- JDK Dynamic Proxy와 CGLIB의 차이
- redis 대기열 구현
- java ThreadLocal
- pipe and filter architecture
- transactional outbox pattern spring boot
- redis sorted set으로 대기열 구현
- 자바 백엔드 개발자 추천 도서
- service based architecture
- java userThread와 DaemonThread
- spring boot excel download oom
- polling publisher spring boot
- 서비스 기반 아키텍처
- microkernel architecture
- spring boot redisson sorted set
- spring boot excel download paging
- pipeline architecture
- spring boot redis 대기열 구현
- @ControllerAdvice
- transactional outbox pattern
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함