Swift 디자인패턴 Facade Pattern (퍼사드 패턴)
퍼사드 패턴은 복잡한 시스템의 인터페이스를 단순화하여 사용자가 시스템을 더 쉽게 사용할 수 있도록 하는 구조 패턴
히스토리
- 2022-06-07: 디자인 패턴 스터디 정리
- 2024-11-26: 포스팅 글 재정리 및 조금 더 실용적인 예제 코드로 변경
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
https://refactoring.guru/ko/design-patterns/facade
'apple > DesignPattern, Architecture' 카테고리의 다른 글
Swift 디자인패턴 Mediator Pattern (중재자 패턴) (1) | 2022.06.15 |
---|---|
Swift 디자인패턴 FlyWeight Pattern (플라이웨이트 패턴) (1) | 2022.06.09 |
Swift 디자인패턴 Multicast Delegate Pattern (멀티캐스트 딜리게이트 패턴) (0) | 2022.06.07 |
Swift 디자인패턴 State Pattern (상태 패턴) (0) | 2022.05.30 |
Swift 디자인패턴 Prototype Pattern (프로토타입 패턴) (0) | 2022.05.28 |