❓ 구조 패턴
클래스나 객체를 조합하여 더 큰 구조를 생성하는 방법이다.
서로 다른 인터페이스를 묶어 단일 인터페이스를 제공하거나, 새로운 기능을 제공한다.
따라서, 독립적인 각 클래스들을 마치 하나인 것처럼 사용한다.
퍼싸드 패턴은 이러한 구조 패턴 중 하나이다.
Facade : 건물의 외관
❓ 퍼싸드 패턴이란
내부의 서브 시스템을 감싸고, 클라이언트에게 인터페이스를 제공하여 쉽게 접근할 수 있도록 하는 패턴
서브 시스템을 더 쉽게 사용할 수 있도록 high-level 인터페이스를 정의하고 제공한다.
즉, 일련의 인터페이스에 대한 통합된 인터페이스를 제공한다.
클라이언트는 내부에 어떤 기능이 존재하는지 복잡한 것에 대해 잘 모르더라도, 해당 기능에 접근하여 사용할 수 있다.
❗예시
클라이언트가 세탁기 버튼을 누른다.
→ 버튼을 누른 행위밖에 안했지만, 내부적으로 물과 세제가 들어가고 헹굼과 탈수과정이 진행된다.
서브 클래스들 사이의 통합 인터페이스를 제공하는 Wrapper 객체 필요
Facade : 사용자의 요청을 서브 시스템에 전달하는 단순하고 일관된 통합 인터페이스
Sub System : 독립적으로 기능이 수행되는 클래스. Facade에 대한 정보를 가지지 않는다.
❔ 서브 시스템을 감싸주는 거라고 그랬으니 캡슐화인가
캡슐화해주는 것처럼 보일 수 있는데, Facade에서는 캡슐화가 되지 않는다.
그저 기능 이용을 위한 간단한 인터페이스를 제공해주는 것이다.
❗구현
System/SubSytem1.java
package System;
class SubSystem1 {
public SubSystem1() {
System.out.println("Call Constructor : " + getClass().getSimpleName());
}
public void process() {
System.out.println("Call Process : " + getClass().getSimpleName());
}
}
System이라는 패키지 내부에 SubSytem1부터 3까지 존재한다.
생성자와 process 메서드가 존재한다.
접근 지정자가 default 로 동일한 패키지 내에서만 접근이 가능하다.
다른 패키지에서는 접근이 불가능하다.
System/Facade.java
package System;
public class Facade {
private SubSystem1 subSystem1;
private SubSystem2 subSystem2;
private SubSystem3 subSystem3;
public Facade() {
subSystem1 = new SubSystem1();
subSystem2 = new SubSystem2();
subSystem3 = new SubSystem3();
}
public void process() {
subSystem1.process();
subSystem2.process();
subSystem3.process();
}
}
마찬가지로 System이라는 패키지에 존재하며, SubSystem와 동일한 패키지에 존재하기 때문에 접근이 가능하다.
process라는 메서드 안에 SubSystem의 process 메서드가 실행될 수 있도록 구현되어있다.
Main.java
import System.Facade;
//import System.SubSystem1;
class Main {
public static void main(String[] args) {
Facade facade = new Facade();
facade.process();
/*
접근 지정자로 인해 접근 불가
new SubSytem1;
*/
}
Main을 실행하면, Facade 내부에 있는 process 메서드를 실행하게 된다.
[ 결과 ]
Facade의 process 메서드만 실행하였는데, 내부적으로 SubSystem의 process 메서드가 실행된 것을 확인할 수 있다.
❗마무리
단순하게 통합된 것을 통해 클라이언트와 서브 시스템 간의 호출 횟수를 줄일 수 있다.
서브 시스템의 구성 요소를 보호할 수 있으며, 클라이언트가 다루어야 하는 객체의 수를 줄일 수 있다.
인터페이스 수가 확장되고, 복잡해질 수 있는 경우에 퍼싸드 패턴을 이용하면 좋다.
비슷한 작업을 해야 하는 다양한 인터페이스 중 하나의 인터페이스를 제공해야 할 때 적용하면 좋다.
참고)
https://gdtbgl93.tistory.com/142
https://dev-aiden.com/design%20pattern/Facade-Pattern/