퍼사드 패턴(Facade Pattern)이란?
퍼사드 패턴은 디자인 패턴(Design Pattern) 중 구조 패턴(Structural Pattern)이다.
구조 패턴 : 클래스나 객체를 조합해서 더 큰 구조를 만드는 패턴
예를 들어, 서로 다른 인터페이스를 지닌 객체 2개를 묶어서 단일 인터페이스를 제공하거나 객체들을 서로 묶어서 새로운 기능을 제공하는 패턴이다.
GoF 디자인 패턴에 의하면 퍼사드 패턴은 하위 시스템을 보다 쉽게 사용할 수 있게 해주는 하나의 통합된 고급 인터페이스(Wrapper)로 제공하기 위함이라고 한다.
사용 목적은 복잡한 서브 시스템을 인터페이스로 감싸서 보다 사용하기 쉽게 만드는 것이다. Facade(외관) 퍼사드는 건물의 정면을 의미하는 단어이며, 주로, 객체지향 프로그래밍 분야와 외부 라이브러리를 추상화하는 데에 많이 사용된다. 즉, 많은 분량의 코드에 접근할 수 있는 단순한 인터페이스를 제공한다.
퍼사드 패턴 : 어떤 소프트웨어의 다른 커다란 코드 부분에 대해 간략화된 인터페이스를 제공해주는 디자인 패턴을 의미한다. 즉, 복잡한 서브 시스템을 단순화된 인터페이스로 감싸서 사용자가 서브 시스템의 내부 구성 요소에 신경 쓰지 않고도 시스템을 쉽게 사용할 수 있도록 하는 패턴이다.
따라서, 퍼사드 패턴은 시스템의 복잡성을 감추고, 클라이언트와 서브 시스템 간의 결합도를 낮춰서 코드를 더 읽기 쉽고 유지보수하기 쉽게 만든다.
퍼사드 패턴 구조
- 퍼사드 클래스 : Interne1, 2, 3 패키지 및 그림에 나오지 않은 그 밖의 응용 프로그램 코드와도 상호 동작을 하며 복잡한 구성 요소들을 단순한 인터페이스로 감싸서 제공하는 클래스이다.
- Interne 패키지 : 소프트웨어 라이브러리 or API 집합이며, 퍼사드 클래스를 통해 접근되는 서브 시스템이다.
- 클라이언트 : 패키지 내의 리소스에 접근하기 위해 퍼사드 클래스를 활용하는 객체이다.
퍼사드 패턴 예제 코드
예제 : 세탁기 시스템
- 서브 시스템 클래스 : 세탁기의 각 구성 요소
class WaterSupply {
public void on() {
System.out.println("Water supply on.");
}
public void off() {
System.out.println("Water supply off.");
}
}
class Drum {
public void rotate() {
System.out.println("Drum rotating.");
}
public void stop() {
System.out.println("Drum stopped.");
}
}
class Heater {
public void on() {
System.out.println("Heater on.");
}
public void off() {
System.out.println("Heater off.");
}
}
class DetergentDispenser {
public void dispense() {
System.out.println("Detergent dispensed.");
}
}
class Dryer {
public void on() {
System.out.println("Dryer on.");
}
public void off() {
System.out.println("Dryer off.");
}
}
- 퍼사드 클래스 : 세탁기의 복잡한 구성 요소들을 단순한 인터페이스로 감싸서 제공
- 실무에서는 ~~~Facade로 퍼사드 패턴이 사용되었다는 것을 따로 명시하지는 않고, Service 형태로 많이 이용한다.
class WashingMachineFacade {
private WaterSupply waterSupply;
private Drum drum;
private Heater heater;
private DetergentDispenser detergentDispenser;
private Dryer dryer;
public WashingMachineFacade() {
this.waterSupply = new WaterSupply();
this.drum = new Drum();
this.heater = new Heater();
this.detergentDispenser = new DetergentDispenser();
this.dryer = new Dryer();
}
public void startWashing() {
System.out.println("Starting washing cycle...");
waterSupply.on();
detergentDispenser.dispense();
heater.on();
drum.rotate();
}
public void startDrying() {
System.out.println("Starting drying cycle...");
drum.stop();
heater.off();
waterSupply.off();
dryer.on();
}
public void stop() {
System.out.println("Stopping washing machine...");
drum.stop();
dryer.off();
heater.off();
waterSupply.off();
}
}
- Main : 퍼사드 클래스를 사용하여 세탁기를 제어하는 클라이언트 코드
public class Main {
public static void main(String[] args) {
WashingMachineFacade washingMachine = new WashingMachineFacade();
// 세탁 사이클 시작
washingMachine.startWashing();
// (시간 경과 후) 건조 사이클 시작
washingMachine.startDrying();
// 세탁기 정지
washingMachine.stop();
}
}
- 위의 세탁기 예제를 보면 사용자는 세탁을 할 때 최종적으로 세탁 사이클 시작, 건조 사이클 시작, 세탁기 정지 버튼만 누르면 세탁기가 세탁의 세부적인 과정을 자동적으로 모두 진행한다. 복잡한 서브 시스템들을 인터페이스로 감싸 사용하기 쉽게 만드는 것이 퍼사드 패턴이다.
'디자인 패턴 & OOP' 카테고리의 다른 글
[디자인 패턴] 템플릿 메서드 패턴(Template Method Pattern) (0) | 2024.06.04 |
---|---|
[OOP] SOLID 객체 지향 설계 5가지 원칙 (1) | 2024.06.02 |
[디자인 패턴] 팩토리 메서드 패턴(Factory Method Pattern) (0) | 2024.05.26 |
[디자인 패턴] 데코레이터 패턴(Decorator Pattern) (0) | 2024.05.19 |
[디자인 패턴] 싱글톤 패턴(Singleton Pattern) (0) | 2024.05.18 |