스트래티지 패턴(Strategy Pattern)은 객체 지향 디자인 패턴 중 하나로, 알고리즘을 정의하고 각각을 캡슐화하며, 이를 상호 교환 가능하도록 만드는 패턴입니다. 이 패턴은 프로그램에서 알고리즘을 선택할 때 유연성을 제공하며, 알고리즘의 적용을 담당하는 코드와 알고리즘 자체를 구현하는 코드를 분리하여 코드의 재사용성을 높이고 유지보수를 용이하게 합니다.
1. 예제 코드
간단한 예제로, 리스트에 대한 정렬을 수행하는 코드를 작성해보겠습니다.
# Strategy pattern example for sorting a list
class SortStrategy:
def sort(self, data):
pass
class QuickSortStrategy(SortStrategy):
def sort(self, data):
print("Using QuickSort")
return sorted(data)
class MergeSortStrategy(SortStrategy):
def sort(self, data):
print("Using MergeSort")
return sorted(data)
class Sorter:
def __init__(self, strategy):
self._strategy = strategy
def sort(self, data):
return self._strategy.sort(data)
# Usage
data = [5, 2, 7, 1, 9, 0, 4, 6, 3, 8]
sorter = Sorter(MergeSortStrategy())
print(sorter.sort(data))
sorter = Sorter(QuickSortStrategy())
print(sorter.sort(data))
위의 코드에서는 SortStrategy라는 추상 클래스와 이를 상속하는 QuickSortStrategy와 MergeSortStrategy 클래스를 정의합니다. 각각의 클래스는 sort() 메소드를 구현합니다.
그리고 Sorter 클래스는 이러한 SortStrategy의 하위 클래스를 사용하여 리스트를 정렬합니다. Sorter 클래스의 생성자는 SortStrategy의 인스턴스를 인수로 받으며, sort() 메소드를 호출하면 SortStrategy의 하위 클래스에서 정의한 실제 정렬 알고리즘을 실행합니다.
위의 코드에서는 Sorter 클래스의 인스턴스를 두 번 생성하여, 각각의 인스턴스에서 다른 SortStrategy 하위 클래스를 사용하여 리스트를 정렬합니다. 실행 결과는 다음과 같습니다.
Using MergeSort
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Using QuickSort
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
위의 결과에서 볼 수 있듯이, Sorter 클래스는 사용하는 SortStrategy 하위 클래스에 따라서 출력이 다릅니다. 이와 같이, Sorter 클래스는 SortStrategy 클래스의 하위 클래스를 변경하여 다양한 정렬 알고리즘을 선택할 수 있습니다.
2. 장점
- 유연성: 알고리즘을 독립적으로 캡슐화하므로, 알고리즘을 쉽게 교체하거나 새로운 알고리즘을 추가할 수 있습니다. 이는 코드의 유연성을 높이며, 재사용성도 증가시킵니다.
- 유지보수성: 알고리즘의 변경이 필요한 경우, 해당 알고리즘만 수정하면 됩니다. 이는 코드의 유지보수성을 높입니다.
- 확장성: 새로운 알고리즘이 필요한 경우, 해당 알고리즘을 구현한 클래스를 추가하면 됩니다. 이는 코드의 확장성을 높이며, 수정이나 재작성 없이 새로운 알고리즘을 쉽게 추가할 수 있습니다.
3. 단점
- 클래스의 개수: 스트래티지 패턴을 구현하려면, 일반적으로 많은 클래스가 필요합니다. 이는 코드의 복잡도를 높이고, 유지보수를 어렵게 할 수 있습니다.
- 알고리즘의 상호작용: 스트래티지 패턴을 사용할 때, 알고리즘들이 서로 상호작용해야하는 경우가 있습니다. 이 경우 알고리즘들 사이의 인터페이스를 잘 정의해야 하며, 알고리즘 간의 결합도를 낮추는 것이 중요합니다.
'설계' 카테고리의 다른 글
[디자인 패턴] 비지터 패턴 (Visitor Pattern) - python 예제 코드 (0) | 2023.03.11 |
---|---|
[디자인 패턴] 템플릿 메서드 패턴 (Template Method Pattern) - python 예제 코드 (0) | 2023.03.11 |
[디자인 패턴] 스테이트 패턴 (State Pattern) - python 예제 코드 (0) | 2023.03.10 |
[디자인 패턴] 옵저버 패턴 (Observer Pattern) - python 예제 코드 (0) | 2023.03.10 |
[디자인 패턴] 메멘토 패턴 (Memento Pattern) - python 예제 코드 (0) | 2023.03.10 |