[python] 스트래티지 패턴
스트래티지 패턴은 소프트웨어 공학에서 종종 사용되는 디자인 패턴 중 하나입니다. 이 패턴은 알고리즘을 캡슐화하고 이를 동적으로 교체할 수 있는 방법을 제공합니다. 스트래티지 패턴을 사용하면 알고리즘을 실행하는 코드와 알고리즘 자체를 개별적으로 다룰 수 있으며, 이를 통해 코드의 재사용성과 유지보수성을 향상시킬 수 있습니다.
스트래티지 패턴의 구성 요소
스트래티지 패턴을 구현하는데는 세 가지 주요 요소가 있습니다.
- 컨텍스트(Context): 알고리즘을 사용하는 객체로, 알고리즘을 실행하는 메서드를 포함합니다.
- 스트래티지(Strategy): 알고리즘을 나타내는 인터페이스 또는 추상 클래스입니다. 모든 스트래티지는 동일한 인터페이스를 구현해야 합니다.
- 구체적인 전략(Concrete Strategies): 스트래티지 인터페이스를 구현하는 실제 알고리즘 클래스입니다.
스트래티지 패턴의 예시
다음은 스트래티지 패턴의 간단한 예시입니다. 가장 일반적인 예로는 정렬 알고리즘을 들 수 있습니다. 컨텍스트는 정렬 알고리즘을 실행하는 메서드를 가지고 있고, 스트래티지는 다양한 정렬 알고리즘을 나타내는 인터페이스입니다. 각각의 구체적인 전략은 실제 정렬 알고리즘을 구현하는 클래스입니다.
class Context:
def __init__(self, strategy):
self.strategy = strategy
def execute_strategy(self, data):
self.strategy.sort(data)
class Strategy:
def sort(self, data):
pass
class BubbleSortStrategy(Strategy):
def sort(self, data):
# Bubble sort algorithm implementation
pass
class QuickSortStrategy(Strategy):
def sort(self, data):
# Quick sort algorithm implementation
pass
# Usage
data = [5, 2, 7, 1, 3]
context = Context(BubbleSortStrategy())
context.execute_strategy(data)
위의 예시에서는 BubbleSortStrategy와 QuickSortStrategy가 스트래티지를 구현하는 클래스입니다. Context 클래스는 선택한 스트래티지에 따라 데이터를 정렬하는 메서드를 실행합니다.
스트래티지 패턴의 장점
- 알고리즘과 실행 코드 간의 결합도를 낮출 수 있습니다.
- 새로운 알고리즘을 추가하기 쉽고, 기존의 코드를 건드리지 않고 알고리즘을 변경할 수 있습니다.
- 코드의 재사용성을 높일 수 있습니다.
- 단일 책임 원칙(Single Responsibility Principle)을 따르기 쉽습니다.
스트래티지 패턴의 한계
- 컨텍스트 객체는 스트래티지 객체를 교체하거나 선택하는 로직을 직접 구현해야 합니다.
- 프로그래머가 스트래티지 객체를 신중하게 선택해야 합니다.
- 추가적인 클래스들이 필요하며, 복잡한 프로젝트에서는 유지보수가 어려울 수 있습니다.