디자인 패턴 톺아보기 - Facade Pattern
Updated:
1. 퍼사드 패턴(Facade Pattern) 이란?
GOF 에서 말하는 퍼사드 패턴의 목적은 아래와 같습니다.
Provide an unified interface to a set of interfaces in a subsystem. Facade defines a higher-level interface that makes the subsystem easier to use.
한 서브시스템 내의 인터페이스 집합에 대한 획일화된 하나의 인터페이스를 제공하는 패턴으로, 서브시스템을 사용하기 쉽도록 상위 수준의 인터페이스를 정의합니다.
1.1. 구조
Sample / Sequence Diagram
- Facade
- 단순하고 일관된 통합 인터페이스를 제공하며, 서브시스템을 구성하는 어떤 클래스가 어떤 요청을 처리해야 하는지 알고 있으며, 사용자의 요청을 해당 서브시스템 객체에 전달합니다.
- 서브시스템 클래스들(Scanner, Parser, ProgramNode 등)
- 서브시스템의 기능을 구현하고, Facade 객체로 할당된 작업을 실제로 처리하지만 Facade에 대한 아무런 정보가 없습니다. 즉, 이들에 대한 어떤 참조자도 가지고 있지 않습니다.
1.2. 사용 방법
- 사용자는 Facade에 정의된 인터페이스를 이용해서 서브시스템과 상호작용합니다.
- 또 Facade는 해당 요청을 서브시스템을 구성하는 적당한 객체에서 전달합니다. 서브시스템을 구성하는 객체가 실제의 요청 처리를 담당하지만 퍼사드는 서브시스템에게 메세지를 전달하기 위해 자신의 인터페이스에 동일한 작업을 정의해야 합니다.
- 퍼사드를 사용하는 사용자는 서브시스템을 구성하는 객체로 직접 접근하지 않아도 됩니다.
1.3. 장/단점
- Advantages (+)
- Decouples clients from a subsystem.
- Decouples subsystems.
1.4. 고려사항
- Consider the left design (problem):
- No facade / direct access. Tight coupling between client and subsystem.
- Consider the right design (solution):
- Working through a facade. Loose coupling between client and subsystem.
2. 퍼사드 패턴(Facade Pattern) 사용예시
파서드 패턴은 다음 경우에 사용합니다.
- 복잡한 서브 시스템에 대한 단순한 인터페이스 제공이 필요할 때
- 추상 개념에 대한 구현 클래스와 사용자 사이에 너무 많은 종속성이 존재할 때
- 서브시스템을 계층화시킬 때
2.1. GOF 패턴
2.1.1. Facade
abstract class Facade {
public abstract String operation();
}
class Facade1 extends Facade {
private Class1 class1;
private Class2 class2;
private Class3 class3;
public Facade1(Class1 class1, Class2 class2, Class3 class3) {
this.class1 = class1;
this.class2 = class2;
this.class3 = class3;
}
public String operation() {
return class1.operation() + class2.operation() + class3.operation();
}
}
class Class1 {
public String operation() {
return "Class1 ";
}
}
class Class2 {
public String operation() {
return "Class2 ";
}
}
class Class3 {
public String operation() {
return "Class3 ";
}
}
2.1.2 Main
public class Main{
public static void main(String[] args) {
Facade facade = new Facade1 (new Class1(), new Class2(), new Class3());
System.out.println(facade.operation());
}
}
결과는 아래와 같습니다.
Class1 Class2 Class3
참고 자료
Leave a comment