[구조 패턴] Chapter 10. Facade Pattern

 

퍼사드 패턴, 소개

퍼사드 패턴은 어떤 시스템이나 라이브러리의 복잡한 기능을 클라이언트에게 더 쉽게 제공하기 위한 패턴이다. 클라이언트가 복잡한 서브시스템과 직접적으로 상호작용하는 대신, 간단한 퍼사드 인터페이스와 상호작용하게끔 한다. 이를 통해 클라이언트는 서브시스템의 내부 구조를 알 필요 없이 퍼사드 인터페이스를 통해 간단하게 사용할 수 있다. 여담으로 비침투적인 스프링 프레임워크도 이러한 퍼사드 정신을 가지고 있다고 본다.

 

 

 

퍼사드 패턴, 코드

before

OrderProcessor.java, PaymentProcessor.java, InventoryManager.java

주문, 결제, 재고 관리로 이어지는 세 개의 서브시스템

// 서브시스템 1: 주문 처리
class OrderProcessor {
    public void processOrder() {
        System.out.println("Order processed");
    }
}
// 서브시스템 2: 결제 처리
class PaymentProcessor {
    public void processPayment() {
        System.out.println("Payment processed");
    }
}
// 서브시스템 3: 재고 관리
class InventoryManager {
    public void updateInventory() {
        System.out.println("Inventory updated");
    }
}

 

Client.java

각각의 서브시스템과 직접적으로 상호작용하는 클라이언트 코드

public class Client {
    public static void main(String[] args) {
        // 각 서브시스템을 사용
        OrderProcessor orderProcessor = new OrderProcessor();
        PaymentProcessor paymentProcessor = new PaymentProcessor();
        InventoryManager inventoryManager = new InventoryManager();

        orderProcessor.processOrder();
        paymentProcessor.processPayment();
        inventoryManager.updateInventory();
        System.out.println("Order completed");
    }
}

 

 

after

OrderServiceFacade.java

각각의 서브시스템을 하나의 퍼사드로 결합

class OrderServiceFacade {
    private OrderProcessor orderProcessor;
    private PaymentProcessor paymentProcessor;
    private InventoryManager inventoryManager;

    public OrderServiceFacade() {
        this.orderProcessor = new OrderProcessor();
        this.paymentProcessor = new PaymentProcessor();
        this.inventoryManager = new InventoryManager();
    }

    public void completeOrder() {
        orderProcessor.processOrder();
        paymentProcessor.processPayment();
        inventoryManager.updateInventory();
        System.out.println("Order completed");
    }
}

 

Client.java

서브시스템과 직접적으로 상호작용할 필요 없이 퍼사드가 제공하는 메서드만 호출한다.

public class Client {
    public static void main(String[] args) {
        // 퍼사드를 통해 주문 서비스 사용
        OrderServiceFacade orderServiceFacade = new OrderServiceFacade();
        orderServiceFacade.completeOrder();
    }
}