apple/DesignPattern, Architecture

Swift 디자인패턴 Facade Pattern (퍼사드 패턴)

lgvv 2022. 6. 7. 15:28

Swift 디자인패턴 Facade Pattern (퍼사드 패턴)

 

퍼사드 패턴은 복잡한 시스템의 인터페이스를 단순화하여 사용자가 시스템을 더 쉽게 사용할 수 있도록 하는 구조 패턴

 

히스토리

  • 2022-06-07: 디자인 패턴 스터디 정리
  • 2024-11-26: 포스팅 글 재정리 및 조금 더 실용적인 예제 코드로 변경

 

Facade Pattern

 

 

Facade Pattern

여러 개의 서브시스템을 하나의 통합된 인터페이스로 감싸서 클라이언트가 복잡한 내부 구조를 알 필요 없이 간단하게 기능을 사용할 수 있도록 제공

  • 여러 서브시스템을 하나의 간단한 인터페이스로 통합
  • 클라이언트는 서브시스템의 세부 사항에 의존하지 않고 Facade를 통해 필요한 기능 호출
  • 시스템 내부 구조가 변경되더라도 Facade 인터페이스가 변하지 않으면 클라이언트 코드에 영향 없음
  • 서로 다른 특성을 가진 디펜던시를 묶어서 처리할 때 용이

퍼사드 패턴은 일반적으로 2가지 개념으로 구성

  • Facade: 시스템과 상호작용하기 위한 간단한 메서드 제공.
  • Dependency: Facade가 소유한 객체이며, 각 의존성은 복잡한 작업의 작은 부분을 수행

퍼사드 패턴 장점 및 단점

  • 장점: 복잡한 하위시스템에서 코드를 별도로 분리 가능
  • 단점: Facade 객체가 앱의 모든 부분을 처리하는 전지전능한 객체가 될 수도 있음

활용 예시

  • 복잡한 UI 구성 요소를 단순화 하여 메서드 호출로 관리할 수 있음
  • 여러 API 호출을 하나의 메서드로 통합해 클라이언트가 쉽게 서버와 통신할 수 있게 함.

 

코드 예시

온라인 주문 시스템 예제.

  • 서로 다른 특성을 가진 디펜던시들을 모아 하나의 Facade 내에서 처리
import SwiftUI

// 서브시스템: 상품 검색
class ProductCatalog {
    func searchProduct(name: String) -> String {
        return "상품 '\(name)'을(를) 찾았습니다."
    }
}

// 서브시스템: 장바구니 관리
class ShoppingCart {
    private var items: [String] = []
    
    func addItem(item: String) {
        items.append(item)
        print("장바구니에 '\(item)'을(를) 추가했습니다.")
    }
    
    func viewCart() -> [String] {
        return items
    }
}

// 서브시스템: 결제 처리
class PaymentProcessor {
    func processPayment(amount: Double) {
        print("결제 처리 중: \(amount) 원이 청구되었습니다.")
    }
}

// Facade 클래스
class ShoppingFacade {
    private let productCatalog: ProductCatalog
    private let shoppingCart: ShoppingCart
    private let paymentProcessor: PaymentProcessor
    
    init() {
        self.productCatalog = ProductCatalog()
        self.shoppingCart = ShoppingCart()
        self.paymentProcessor = PaymentProcessor()
    }
    
    func purchaseProduct(name: String, price: Double) {
        let productInfo = productCatalog.searchProduct(name: name)
        print(productInfo)
        
        shoppingCart.addItem(item: name)
        
        let totalAmount = price
        paymentProcessor.processPayment(amount: totalAmount)
        
        print("구매가 완료되었습니다.")
    }
}

private struct ContentView: View {
    var body: some View {
        Button("Execute") {
            // 사용 예
            let shoppingFacade = ShoppingFacade()
            shoppingFacade.purchaseProduct(name: "아이폰 14", price: 1000000)

        }
    }
}

#Preview {
    ContentView()
}

 

 

 

(참고)

https://www.raywenderlich.com/books/design-patterns-by-tutorials/v3.0/chapters/17-facade-pattern

 

Design Patterns by Tutorials, Chapter 17: Facade Pattern

The facade pattern is a structural pattern that provides a simple interface to a complex system. Use this pattern whenever you have a system made up of multiple components and want to provide a simple way for users to perform complex tasks.

www.kodeco.com:443

https://refactoring.guru/ko/design-patterns/facade

 

퍼사드 패턴

/ 디자인 패턴들 / 구조 패턴 퍼사드 패턴 다음 이름으로도 불립니다: Facade 의도 퍼사드 패턴은 라이브러리에 대한, 프레임워크에 대한 또는 다른 클래스들의 복잡한 집합에 대한 단순화된 인터

refactoring.guru