퍼사드 패턴(Facade Pattern)은 구조(Structural) 패턴 중 하나로써 복잡한 서브 클래스들을 피해 더 상위에 인터페이스를 구성함으로써 서브 클래스들의 기능을 간편하게 사용할 수 있도록 하는 패턴이다.
건물의 외관을 뜻하는 퍼사드(Facade)처럼 퍼사드 패턴은 건물의 내부(서브 클래스)들을 건물의 외관(상위의 인터페이스)으로 감싸서 사용할 수 있으며 건물의 내부는 들여다볼 수 없다는 것을 의미한다.
즉, 복잡한 내부 동작은 알 필요 없고 기능 자체만 사용하면 되는 경우 사용하면 되는 디자인 패턴이다.
서브 클래스들 사이의 통합 인터페이스를 제공하는 Wrapper 객체가 필요하다.
퍼사드 패턴의 구조는 다음과 같다.
- Facade : Package의 기능들을 감싸는 상위 인터페이스, 하위의 기능들을 수행하는 단순한 메서드 하나를 가짐
- package : 각 기능을 담당하는 클래스
이전에 공부한 "웹 브라우저에 URL을 입력했을 때 발생하는 일"을 예시로 퍼사드 패턴을 알아보자.
실제로 웹 브라우저를 사용하는 User는 URL을 주소창에 입력하여 Enter만 누르면 되지 내부에서 어떻게 동작하는지는 알 필요가 없다.
즉, 내부 동작을 감싸서 전체 기능만 수행할 수 있으면 되기 때문에 퍼사드 패턴을 활용할 수 있다.
URL을 웹 브라우저에 입력하여 Enter를 누르면 내부에서는 총 8단계의 과정을 통해 우리의 화면에 주소창의 정보들이 출력된다. 따라서 각 기능들을 단계별로 클래스로 나타낸다.
여기서 각 기능들은 별도의 패키지를 하나 선언하여 그 안에 구현해준다. 이유는 패키지 내에 선언한 클래스들은 public 접근 제한자를 붙이지 않으면 default로 지정되기 때문에 오직 같은 패키지 내에서만 접근할 수 있게 된다.
외부의 Client에서는 내부의 기능을 알 필요가 없기 때문에 접근할 수 없도록 해주는 것이다.
package UrlSystem;
class Level1 {
public Level1(String URL) {
System.out.println(URL + " Enter!");
System.out.println("===============================================");
System.out.println("Level 1 : 브라우저의 "+ URL + " 파싱");
}
}
class Level2 {
public Level2(String URL) {
System.out.println("Level 2 : HSTS 목록 조회");
}
}
. . .
class Level8 {
public Level8(String URL) {
System.out.println("Level 8 : 브라우저에서 응답을 해석");
System.out.println("===============================================");
System.out.println(URL + " 화면 출력!");
}
}
이렇게 총 8단계의 기능을 가지는 클래스들을 각각 구현해준다. 외부에서는 해당 기능들을 접근할 수 없기 때문에 8단계의 기능을 수행해주는 상위 인터페이스 하나를 구현해준다.
package UrlSystem;
public class UrlFacade {
Level1 level1; Level2 level2;
Level3 level3; Level4 level4;
Level5 level5; Level6 level6;
Level7 level7; Level8 level8;
public UrlFacade(String URL) {
level1 = new Level1(URL); level2 = new Level2(URL);
level3 = new Level3(URL); level4 = new Level4(URL);
level5 = new Level5(URL); level6 = new Level6(URL);
level7 = new Level7(URL); level8 = new Level8(URL);
}
}
UrlFacade 클래스는 8단계의 기능을 수행해 줄 수 있다. 또한, 같은 UrlSystem Package이지만 public 접근 제한자를 사용하기 때문에 외부의 Client에서도 접근할 수 있다.
Client는 UrlFacade 클래스를 통해 URL의 내부 동작을 알 필요 없이 원하는 기능을 수행할 수 있다.
package facade;
import UrlSystem.UrlFacade;
public class Client {
public static void main(String[] args) {
UrlFacade urlFacade = new UrlFacade("https://www.naver.com/");
}
}
각 클래스들의 구조는 다음과 같다.
퍼사드 패턴을 활용하면 하위 클래스 기능들을 하나의 상위 인터페이스로 단순화시켜 사용할 수 있는 장점이 있다.
'IT 개인 공부 > 디자인패턴' 카테고리의 다른 글
중재자 패턴(Mediator) (1) | 2021.07.29 |
---|---|
옵저버 패턴(Observer Pattern) (0) | 2021.07.29 |
책임 연쇄 패턴(Chain of Resposibility Pattern) (0) | 2021.07.28 |
방문자 패턴(Visitor Pattern) (0) | 2021.07.28 |
데코레이터 패턴(Decorator Pattern) (0) | 2021.07.28 |
댓글