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

 


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

 

Design Patterns by Tutorials, Chapter 5: Strategy Pattern

The strategy pattern defines a family of interchangeable objects that can be set or switched at runtime: the object using a strategy, the strategy protocol, and the set of strategies. You continue to build out RabbleWabble and learn how these three compone

www.kodeco.com:443

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

 

전략 패턴

/ 디자인 패턴들 / 행동 패턴 전략 패턴 다음 이름으로도 불립니다: Strategy 의도 전략 패턴은 알고리즘들의 패밀리를 정의하고, 각 패밀리를 별도의 클래스에 넣은 후 그들의 객체들을 상호교환

refactoring.guru