- Published on
[ Design Pattern ] Strategy Pattern
- Authors
- Name
- 유사공대생
Strategy Pattern이란?
전략(Strategy) 패턴은 객체지향 디자인 패턴 중 하나로, 행위(behavior)를 캡슐화하고 해당 행위를 실행 시간에 동적으로 선택 및 교체할 수 있도록 하는 패턴이다. 이 패턴은 알고리즘 패밀리를 정의하고 각 알고리즘을 캡슐화하여 상호 교체 가능하게 만든다.
Strategy Pattern의 구성요소
- 전략(Strategy): 여러 알고리즘을 표현하는 인터페이스 또는 추상 클래스를 정의한다. 이 인터페이스나 추상 클래스는 여러 구체적인 전략 클래스에서 구현된다.
전략(Strategy) 인터페이스를 정의한다.
interface SortStrategy {
void sort(int[] array);
}
- 구체적인 전략(Concrete Strategy): 전략 인터페이스를 구현하는 여러 클래스로, 각 클래스는 특정한 알고리즘을 나타낸다.
class BubbleSort implements SortStrategy {
@Override
public void sort(int[] array) {
// 버블 정렬 알고리즘 구현
}
}
class QuickSort implements SortStrategy {
@Override
public void sort(int[] array) {
// 퀵 정렬 알고리즘 구현
}
}
- 컨텍스트(Context): 전략 객체를 사용하는 클래스이다. 컨텍스트는 전략 객체를 포함하고, 필요할 때 전략을 교체하거나 실행한다. 컨텍스트는 클라이언트 코드와 전략 객체 사이의 중간자 역할을 한다. 이 클래스는 전략 인터페이스를 참조하고 전략을 교체할 수 있는 메서드를 제공한다.
class Sorter {
private SortStrategy strategy;
public void setStrategy(SortStrategy strategy) {
this.strategy = strategy;
}
public void performSort(int[] array) {
strategy.sort(array);
}
}
전략 패턴을 사용하면 알고리즘을 독립적으로 변경하거나 새로운 알고리즘을 추가하기가 용이하며, 코드 재사용성과 유지보수성을 높일 수 있다. 이 패턴은 특히 다음과 같은 경우에 유용하다.
- 여러 알고리즘을 동적으로 교체해야 하는 경우.
- 알고리즘의 변형이 필요한 경우.
- 알고리즘을 테스트하고 유지하기 쉬운 방식으로 구현하고자 하는 경우.
실제 사용한 전략 패턴
public class Client {
public static void main(String[] args) {
int[] data = {5, 1, 3, 4, 2};
Sorter sorter = new Sorter();
// 버블 정렬 전략 사용
sorter.setStrategy(new BubbleSort());
sorter.performSort(data);
// 퀵 정렬 전략 사용
sorter.setStrategy(new QuickSort());
sorter.performSort(data);
}
}