ETC/Design Pattern

[Design Pattern] 파사드 패턴 (Facade Pattern)

장쫄깃 2023. 4. 16. 20:39
728x90

파사드 패턴 (Facade Pattern) 이란?


파사드 패턴여러 개의 저수준 인터페이스를 하나의 고수준 인터페이스로 묶어주는 패턴이다. 클라이언트가 여러 저수준 인터페이스의 동작을 제어하려면 여러 저수준 인터페이스를 일일이 호출해야 하는데, 파사드 패턴을 이용하면 고수준 인터페이스의 메소드 호출만으로 한번에 동작을 수행할 수 있게 된다.

 

파사드 패턴은 일종의 인터페이스 역할을 수행하며, 시스템 외부에 제공되는 단일 인터페이스를 통해 복잡한 내부 동작을 추상화시켜 사용자가 쉽게 시스템을 사용할 수 있도록 도와주기 때문에, 클라이언트 객체는 여러 저수준 인터페이스 객체들과 느슨한 의존성을 가지게 된다.

 

파사드 패턴은 시스템 내부의 다양한 서브시스템들을 감싸고 있는 하나의 파사드 클래스를 정의하며, 해당 클래스는 클라이언트와 시스템 내부의 다른 객체들 간 인터페이스 역할을 한다. 클라이언트는 이러한 단일 인터페이스를 통해 파사드 클래스와 상호 작용하며 복잡한 기능을 수행한다. 파사드 클래스는 이를 각 서브시스템에 전달하여 시스템의 복잡성을 숨기고 간단한 인터페이스를 제공한다.

 

파사드 패턴은 시스템을 좀 더 모듈화하고 유연하게 만들어준다. 시스템의 내부 구조가 변경되더라도 파사드 클래스를 수정하면 되기 때문에, 클라이언트와의 인터페이스를 변경하지 않아도 된다. 또한, 클라이언트는 복잡한 내부 동작을 이해하지 않고도 간단한 인터페이스를 사용하여 시스템을 조작할 수 있으므로, 시스템을 더 쉽게 사용할 수 있다.

 

퍼사드 패턴

 

 

파사드 패턴의 장단점


  • 장점
    • 복잡한 시스템을 간단하게 추상화하여 사용자가 쉽게 사용
    • 시스템 내부의 변경이 클라이언트에게 영향을 미치지 않음 (유연성 증가)
    • 각 서브시스템 간의 결합도를 낮추고, 모듈화된 시스템을 구성
    • 코드의 재사용성 증가
  • 단점
    • 파사드 클래스가 시스템 내부의 여러 클래스와 서브시스템들을 노출시키지 않고 감싸기 위해 시스템의 전반적인 설계와 구현 방식 고려
    • 파사드 클래스는 클라이언트가 사용할 기능만 노출시키므로, 모든 기능을 제공하지 않을 수 있음
    • 파사드 클래스가 다수의 서브시스템들과 상호작용을 해야하므로, 이에 대한 오버헤드가 발생할 수 있음

 

 

파사드 패턴 구현


아래와 같이 서브클래스들을 정의한다.

public class SubsystemA {
    public void methodA() {
        System.out.println("SubsystemA methodA is called");
    }
}

public class SubsystemB {
    public void methodB() {
        System.out.println("SubsystemB methodB is called");
    }
}

public class SubsystemC {
    public void methodC() {
        System.out.println("SubsystemC methodC is called");
    }
}

 

서브클래스들을 감싸는 하나의 파사드 클래스를 정의한다.

public class Facade {
    private final SubsystemA subsystemA;
    private final SubsystemB subsystemB;
    private final SubsystemC subsystemC;

    public Facade() {
        this.subsystemA = new SubsystemA();
        this.subsystemB = new SubsystemB();
        this.subsystemC = new SubsystemC();
    }

    public void method() {
        subsystemA.methodA();
        subsystemB.methodB();
        subsystemC.methodC();
    }
}

 

클라이언트에서 파사드 클래스의 method()를 호출하여 서브시스템들을 한번에 수행한다.

public class Client {
    public static void main(String[] args) {
        Facade facade = new Facade();
        facade.method();
    }
}
728x90