퍼사드 패턴(Facade Pattern)은 구조적 디자인 패턴으로, 복잡한 서브시스템의 인터페이스를 단순화하여 사용자가 서브시스템의 내부 복잡성을 알 필요 없이 사용할 수 있도록 돕는다.
이 패턴은 여러 객체와 클래스의 관계를 캡슐화하여 클라이언트가 더 쉽게 시스템과 상호작용할 수 있게 한다.
소프트웨어 시스템은 시간이 지나며 기능이 추가될수록 복잡해진다.
클라이언트가 서브시스템의 모든 세부 사항을 알아야 한다면 다음과 같은 문제점이 생긴다:
퍼사드 패턴은 다음과 같은 이점을 제공한다:
스마트 홈 시스템은 조명, 에어컨, 커튼 등을 제어할 수 있다.
퍼사드 패턴을 사용하면 단순한 인터페이스로 다양한 기능을 쉽게 제어할 수 있다.
Client → Facade → SubsystemA
→ SubsystemB
→ SubsystemC
이번 예시에서는 “스마트 홈 시스템”을 퍼사드 패턴으로 구현해보겠다.
// 서브시스템 클래스 1
class Light {
public void turnOn() {
System.out.println("조명이 켜졌습니다.");
}
public void turnOff() {
System.out.println("조명이 꺼졌습니다.");
}
}
// 서브시스템 클래스 2
class AirConditioner {
public void turnOn() {
System.out.println("에어컨이 켜졌습니다.");
}
public void turnOff() {
System.out.println("에어컨이 꺼졌습니다.");
}
public void setTemperature(int temperature) {
System.out.println("에어컨 온도가 " + temperature + "도로 설정되었습니다.");
}
}
// 서브시스템 클래스 3
class Curtain {
public void open() {
System.out.println("커튼이 열렸습니다.");
}
public void close() {
System.out.println("커튼이 닫혔습니다.");
}
}
// Facade 클래스
class SmartHomeFacade {
private Light light;
private AirConditioner airConditioner;
private Curtain curtain;
public SmartHomeFacade() {
this.light = new Light();
this.airConditioner = new AirConditioner();
this.curtain = new Curtain();
}
public void startMorningRoutine() {
System.out.println("아침 루틴을 시작합니다.");
light.turnOn();
curtain.open();
airConditioner.setTemperature(22);
}
public void startNightRoutine() {
System.out.println("야간 루틴을 시작합니다.");
light.turnOff();
curtain.close();
airConditioner.turnOff();
}
}
// 클라이언트 코드
public class Main {
public static void main(String[] args) {
SmartHomeFacade smartHome = new SmartHomeFacade();
// 아침 루틴 실행
smartHome.startMorningRoutine();
System.out.println();
// 야간 루틴 실행
smartHome.startNightRoutine();
}
}
Light
, AirConditioner
, Curtain
클래스가 복잡한 동작을 정의한다.SmartHomeFacade
클래스는 서브시스템을 통합하고 단순화된 인터페이스를 제공한다.Main
클래스는 퍼사드를 통해 서브시스템을 제어한다.아침 루틴을 시작합니다.
조명이 켜졌습니다.
커튼이 열렸습니다.
에어컨 온도가 22도로 설정되었습니다.
야간 루틴을 시작합니다.
조명이 꺼졌습니다.
커튼이 닫혔습니다.
에어컨이 꺼졌습니다.
퍼사드 패턴(Facade Pattern)은 복잡한 서브시스템을 감추고, 단순하고 직관적인 인터페이스를 제공하여 클라이언트 코드의 복잡성을 줄인다.
특히, 모듈화된 시스템에서 퍼사드를 사용하면 코드 가독성과 유지보수성을 높일 수 있다.
아래 글에서 다른 디자인 패턴들을 확인할 수 있다.
디자인 패턴 모음