디자인 패턴

Facade Pattern

kyoulho 2024. 5. 12. 16:22

퍼사드 패턴은 복잡한 시스템이나 서브시스템의 인터페이스를 단순화시켜 사용자에게 간단한 하나의 인터페이스를 제공하는 구조적인 패턴이다.

이 패턴은 클라이언트가 복잡한 시스템 내부 구조를 알 필요 없이 특정 기능을 수행할 수 있도록 한다.

 

퍼사드를 사용해야 하는 상황

  1. 복잡한 서브시스템이 존재하는 경우:
    • 시스템이 여러 개의 복잡한 서브시스템으로 구성되어 있을 때, 각 서브시스템을 단순한 인터페이스로 노출시켜야 하는 경우에 퍼사드 패턴을 사용할 수 있다.
  2. 클라이언트와 서브시스템 간의 결합도를 낮춰야 하는 경우:
    • 서브시스템의 변경이나 교체가 빈번하게 발생하는 경우, 클라이언트와 서브시스템 간의 직접적인 결합을 피하고자 할 때 퍼사드를 도입할 수 있다.
  3. 인터페이스의 간소화가 필요한 경우:
    • 여러 개의 복잡한 인터페이스를 단일한 간소한 인터페이스로 제공하고자 할 때, 퍼사드 패턴은 클라이언트에게 편리한 방법을 제공한다.
  4. 유연성과 확장성이 요구되는 경우:
    • 새로운 서브시스템을 추가하거나 기존 서브시스템을 변경해도 클라이언트에게는 퍼사드의 인터페이스만 노출시킬 수 있다.
  5. 시스템의 일관성을 유지하고자 하는 경우:
    • 여러 개의 서브시스템 간에 일관성을 유지하고자 할 때, 퍼사드를 통해 클라이언트에게 일관된 인터페이스를 제공할 수 있다.
  6. 특정 기능을 효과적으로 노출 또는 감추어야 하는 경우:
    • 일부 서브시스템의 특정 기능을 클라이언트에 노출하거나, 그 기능을 감추어야 하는 경우에 퍼사드 패턴을 쓸 수 있다.

 

퍼사드 패턴의 주요 구성 요소

  1. 퍼사드(Facade):
    • 클라이언트에게 간단한 인터페이스를 제공하는 역할.
    • 하나 이상의 서브시스템을 조율하고, 클라이언트의 요청을 해당 서브시스템에 전달한다.
  2. 서브시스템(Subsystems):
    • 퍼사드가 감싸는 복잡한 시스템이나 일련의 클래스들을 나타낸다.
    • 각 서브시스템은 독립적으로 동작하며, 퍼사드에 의해 통합된다.
  3. 클라이언트(Client):
    • 퍼사드를 이용해 서브시스템에 접근하는 주체.
    • 퍼사드를 통해 복잡한 시스템을 더 쉽게 사용할 수 있다.

 

예제

// 전등 시스템
class LightSystem {
    public void turnOn() {
        System.out.println("전등이 켜집니다.");
    }

    public void turnOff() {
        System.out.println("전등이 꺼집니다.");
    }
}

// 에어컨 시스템
class AirConditionerSystem {
    public void turnOn() {
        System.out.println("에어컨이 켜집니다.");
    }

    public void turnOff() {
        System.out.println("에어컨이 꺼집니다.");
    }
}

// 보안 시스템
class SecuritySystem {
    public void arm() {
        System.out.println("보안 시스템이 가동됩니다.");
    }

    public void disarm() {
        System.out.println("보안 시스템이 해제됩니다.");
    }
}

// 퍼사드
class HomeFacade {
    private LightSystem lightSystem;
    private AirConditionerSystem airConditionerSystem;
    private SecuritySystem securitySystem;

    public HomeFacade() {
        this.lightSystem = new LightSystem();
        this.airConditionerSystem = new AirConditionerSystem();
        this.securitySystem = new SecuritySystem();
    }

    public void leaveHome() {
        lightSystem.turnOff();
        airConditionerSystem.turnOff();
        securitySystem.arm();
    }

    public void returnHome() {
        lightSystem.turnOn();
        airConditionerSystem.turnOn();
        securitySystem.disarm();
    }
}

// 클라이언트
public class Client {
    public static void main(String[] args) {
        HomeFacade homeFacade = new HomeFacade();

        // 집을 떠날 때
        System.out.println("집을 떠납니다.");
        homeFacade.leaveHome();

        // 집으로 돌아올 때
        System.out.println("\n집으로 돌아옵니다.");
        homeFacade.returnHome();
    }
}

'디자인 패턴' 카테고리의 다른 글

Flyweight Pattern  (0) 2024.05.25
Factory Pattern  (0) 2024.05.18
Decorator Pattern  (0) 2024.05.05
Composite Pattern  (1) 2024.05.01
Command Pattern  (0) 2024.04.28