
소프트웨어 개발
Strategy Pattern전략 패턴
전략 패턴(Strategy Pattern)은 알고리즘을 캡슐화하고 교환 가능하게 만드는 행동 패턴이다. 런타임에 알고리즘을 선택할 수 있어 조건문 없이 다양한 동작을 지원한다.
구조
Context ──→ Strategy (인터페이스)
├── ConcreteStrategyA
├── ConcreteStrategyB
└── ConcreteStrategyCPython 구현
python
from abc import ABC, abstractmethod
from typing import List
# 정렬 전략
class SortStrategy(ABC):
@abstractmethod
def sort(self, data: List[int]) -> List[int]: pass
class BubbleSort(SortStrategy):
def sort(self, data: List[int]) -> List[int]:
arr = data.copy()
for i in range(len(arr)):
for j in range(len(arr)-i-1):
if arr[j] > arr[j+1]:
arr[j], arr[j+1] = arr[j+1], arr[j]
return arr
class QuickSort(SortStrategy):
def sort(self, data: List[int]) -> List[int]:
if len(data) <= 1: return data
pivot = data[len(data)//2]
left = [x for x in data if x < pivot]
mid = [x for x in data if x == pivot]
right= [x for x in data if x > pivot]
return self.sort(left) + mid + self.sort(right)
# 컨텍스트
class Sorter:
def __init__(self, strategy: SortStrategy):
self._strategy = strategy
def set_strategy(self, strategy: SortStrategy):
self._strategy = strategy
def sort(self, data: List[int]) -> List[int]:
return self._strategy.sort(data)
data = [5, 2, 8, 1, 9]
sorter = Sorter(BubbleSort())
print(sorter.sort(data))
sorter.set_strategy(QuickSort())
print(sorter.sort(data))결제 시스템 예시
python
class PaymentStrategy(ABC):
@abstractmethod
def pay(self, amount: float) -> bool: pass
class CreditCard(PaymentStrategy):
def pay(self, amount): print(f"신용카드 결제: {amount}원"); return True
class KakaoPay(PaymentStrategy):
def pay(self, amount): print(f"카카오페이 결제: {amount}원"); return True
class Order:
def __init__(self, payment: PaymentStrategy):
self.payment = payment
def checkout(self, amount: float):
return self.payment.pay(amount)