apple/DesignPattern, Architecture
Swift 디자인패턴 Strategy Pattern (전략 패턴)
lgvv
2022. 4. 11. 02:05
Swift 디자인패턴 Strategy Pattern (전략 패턴)
Strategy 패턴은 행위(behavior)를 캡슐화하여 런타임에 알고리즘을 교체할 수 있게 해주는 행동 패턴
동일한 문제를 해결하기 위해 여러 알고리즘이 존재할 때, 코드를 유연하고 확장 가능하게 만들 수 있음
히스토리
- 2022-04-11: 디자인 패턴 스터디 정리
- 2024-11-29: 포스팅 글 재정리 및 조금 더 실용적인 예제 코드로 변경
Strategy Pattern
전략 패턴은 일반적으로 3가지 요소로 구성
- Context: 전략(Strategy)를 사용하는 객체로 클라이언트가 사용하는 인터페이스로, 구체적인 알고리즘(전략)은 Strategy 객체에 위임
- Strategy Interface: 알고리즘의 공통 인터페이스 정의
- Concrete Strategies: Strategy 인터페이스를 구현한 구현체로 적절한 알고리즘 제공
장점
- 유연성: 런타임에 전략(알고리즘)을 쉽게 교체 가능
- 코드 재사용: 알고리즘을 독립적으로 캡슐화하여 중복을 줄임
- OCP 준수: 기존 코드를 수정하지 않고 새로운 전략을 추가 가능
단점
- 복잡성 증가: 다양한 전략을 관리하기 위한 추가 코드가 필요함
- 객체 수 증가: 각 전략이 별도의 객체이므로 관리해야 할 객체 수가 늘어나게 됨
사용하면 좋은 경우
- 타입에 따라 레이아웃 규칙이 다른 경우
- 결제 시스템에서 결제 방법을 런타임에 결정하는 경우
코드 예제
결제 시스템을 예제로 만들어보고자 함.
import SwiftUI
protocol PaymentStrategy {
func pay(amount: Double)
}
class CreditCardPayment: PaymentStrategy {
func pay(amount: Double) {
print("Paid \(amount) using Credit Card.")
}
}
class PayPalPayment: PaymentStrategy {
func pay(amount: Double) {
print("Paid \(amount) using PayPal.")
}
}
class ApplePayPayment: PaymentStrategy {
func pay(amount: Double) {
print("Paid \(amount) using Apple Pay.")
}
}
class PaymentContext {
private var strategy: PaymentStrategy
init(strategy: PaymentStrategy) {
self.strategy = strategy
}
func updateStrategy(_ strategy: PaymentStrategy) {
self.strategy = strategy
}
func executePayment(amount: Double) {
strategy.pay(amount: amount)
}
}
private struct ContentView: View {
var body: some View {
Button("Execute") {
// 초기 전략 설정
let context = PaymentContext(strategy: CreditCardPayment())
context.executePayment(amount: 100.0)
// 런타임에 전략 변경
context.updateStrategy(PayPalPayment())
context.executePayment(amount: 200.0)
context.updateStrategy(ApplePayPayment())
context.executePayment(amount: 300.0)
}
}
}
#Preview {
ContentView()
}
(참고)
https://www.raywenderlich.com/books/design-patterns-by-tutorials/v3.0/chapters/5-strategy-pattern
https://refactoring.guru/ko/design-patterns/strategy