전략(Strategy) 패턴
전략 패턴은 행위를 각각의 전략(Strategy) 클래스로 캡슐화하여, 런타임에 알고리즘을 자유롭게 바꿀수 있도록 해주는 디자인 패턴을 말합니다.
즉 행위(Behavior)를 객체화하고, 실행 중에 교체 가능하도록 설계하는 패턴입니다.
전략 패턴은 아래와 같은 경우에 사용합니다.
- 알고리즘(로직)이 여러개 존재하고, 상황에 따라 동적으로 교체해야할 때
- 조건문이 많고 각 분기마다 알고리즘이 다른 경우
- 실행 중에 알고리즘을 바꾸고 싶을 때
전략(Strategy) 패턴 구성요소
전략 패턴은 다음과 같이 구성됩니다.
1. Strategy(전략 인터페이스)
알고리즘에 공통으로 적용되는 인터페이스 정의
2. ConcreteStrategy (구체 전략 인터페이스)
Stragety를 구현한 실제 알고리즘
3. Context
Stragety객체를 사용하며, 알고리즘을 실행하는 주체
전략(Strategy) 패턴 예제
전략패턴에 대해 설명하기 위해 간단한 결제 기능을 예시로 들겠습니다.
Strategy Interface
# Strategy interface
class PaymentStrategy:
def pay(self, amount):
pass
PaymentStrategy 클래스는 공통 인터페이스로 결제를 수행하는 pay()메소드를 정의합니다
ConcreteStrategy
# Concrete Strategy
class CreditCardPayment(PaymentStrategy):
def __init__(self, card_number):
self.card_number = card_number
def pay(self, amount):
print(f"신용카드({self.card_number})로 {amount}원 결제함.")
class KakaoPayPayment(PaymentStrategy):
def __init__(self, kakao_id):
self.kakao_id = kakao_id
def pay(self, amount):
print(f"카카오페이({self.kakao_id})로 {amount}원 결제함.")
CreditCardPayment와 KakaoPayPayment는 이를 구현한 구체 전략(ConcreteStrategy) 으로, 각각 카드 결제와 카카오페이 결제를 수행함.
Context
# Context
class PaymentContext:
def __init__(self, strategy: PaymentStrategy):
self.strategy = strategy
def set_strategy(self, strategy: PaymentStrategy):
self.strategy = strategy
def execute_payment(self, amount):
self.strategy.pay(amount)
PaymentContext는 Context 역할을 하며, 전략을 받아서 execute_payment()를 호출할 때 실제 결제 전략을 실행함.
전략은 생성자에서 주입하거나 set_strategy() 메서드로 변경 가능.
사용 예시
# 사용 예시
context = PaymentContext(CreditCardPayment("1234-5678"))
context.execute_payment(10000) # → 신용카드(1234-5678)로 10000원 결제함.
# 전략 교체
context.set_strategy(KakaoPayPayment("jinsu_kakao"))
context.execute_payment(15000) # → 카카오페이(jinsu_kakao)로 15000원 결제함.
전략(Strategy) 패턴 장/단점
장점
1. 알고리즘 쉽게 교체 가능
2. 조건문 제거가 가능하여 코드 가독성이 높아짐
3. 새로운 전략 추가시 기존 코드 수정 없이 확장 가능
단점
1. Stragety 클래스가 많아질 수 있음
2. 클라이언트가 어떤 전략을 써야하는지 알아야함
Strategy 패턴은 알고리즘을 각각의 클래스로 분리해 놓고, 필요한 전략을 선택하여 사용할 수 있도록 해주는 유연한 구조를 제공합니다.
특히, 서버 개발이나 보안 로직에서 다양한 인증 방식을 적용해야 하는 상황에서 유용하게 활용됩니다.
'Programming > Design pattern' 카테고리의 다른 글
[Design pattern] 커맨드(Command) 패턴 (14) | 2025.07.11 |
---|---|
[Design pattern] 옵저버(Observer) 패턴 (10) | 2025.07.10 |
[Design pattern] 프록시(Proxy)패턴 (11) | 2025.07.04 |
[Design pattern] 플라이웨이트(Flyweight)패턴 (3) | 2025.07.04 |
[Design pattern] 퍼사드(Facade)패턴 (9) | 2025.07.03 |