전략 패턴(Strategy Pattern)
알고리즘을 정의하고 해당 알고리즘을 실행하는 부분을 분리하여 교체 가능하게 하는 패턴이다.
이를 통해 알고리즘을 동적으로 선택하거나 확장하기가 용이해 진다.
전략 패턴의 구성 요소
1. 전략(Strategy)
- 알고리즘을 나타내는 인터페이스나 추상 클래스
- 여러 알고리즘의 공통점을 정의한다
2. 구체적인 전략(Concrete Strategy)
- 전략 인터페이스를 구현한 클래스
- 각각의 클래스는 다양한 알고리즘을 구현한다
3. 컨텍스트(Context)
- 전략을 사용하는 클라이언트
- 필요에 따라 다른 전략을 선택하고 실행한다
예시
전략(Strategy)
// 정렬 전략을 나타내는 인터페이스
interface SortStrategy {
void sort(int[] data);
}
구체적인 전략(Concrete Strategy)
// Bubble Sort 알고리즘을 구현한 클래스
class BubbleSort implements SortStrategy {
public void sort(int[] data) {
System.out.println("Bubble Sort 사용");
// Bubble Sort 알고리즘 구현
}
}
// Quick Sort 알고리즘을 구현한 클래스
class QuickSort implements SortStrategy {
public void sort(int[] data) {
System.out.println("Quick Sort 사용");
// Quick Sort 알고리즘 구현
}
}
컨텍스트(Context)
// 정렬 전략을 사용하는 컨텍스트 클래스
class SortContext {
private SortStrategy strategy;
// 전략 설정 메서드
public void setStrategy(SortStrategy strategy) {
this.strategy = strategy;
}
// 정렬 실행 메서드
public void performSort(int[] data) {
strategy.sort(data);
}
}
사용 예시
public class Main {
public static void main(String[] args) {
int[] data = {3, 1, 4, 1, 5, 9, 2, 6};
SortContext context = new SortContext();
// Bubble Sort 전략 사용
context.setStrategy(new BubbleSort());
context.performSort(data);
// Quick Sort 전략 사용
context.setStrategy(new QuickSort());
context.performSort(data);
}
}
장점
1. 유연성: 알고리즘을 쉽게 변경 및 대체할 수 있다.
2. 확장성: 알고리즘 추가 및 수정을 할 때 코드 수정이 최소화 된다.
3. 재사용성: 알고리즘을 캡슐화했기에 코드 재사용성이 뛰어나다.
4. 테스트 용이성: 각각 알고리즘을 독립적으로 테스트할 수 있다.
단점
1. 복잡성: 추가적인 클래스 및 인터페이스가 필요하기에 코드 복잡성이 증가될 수 있다
2. 오버헤드: 런타임 시에 알고리즘을 선택할 때 추가적인 오버헤드가 발생할 수 있다
3. 구현의 어려움: 전략패턴을 구현하는 것이 어려울 수 있으므로, 적절한 분석과 설계가 필요하다
전략패턴과 팩토리 메서드 패턴의 차이
목적
- 전략 패턴은 런타임에 알고리즘을 선택할 수 있도록 하는 것에 중점을 둔다
- 팩토리 메서드 패턴은 객체 생성을 캡슐화하고, 하위 클래스에서 객체의 생성 방법을 결정하는 것에 중점을 둔다.
최종 결과물
- 전략 패턴은 여러 가지 알고리즘을 런타임에 선택하여 사용할 수 있다.
- 팩토리 메서드 패턴은 객체의 생성 방법이 서브클래스에 의해 결정된다.
구성 요소
- 전략 패턴은 주로 컨텍스트와 전략으로 이루어진다.
- 팩토리 메서드 패턴은 Creator와 ConcreteCreator, Product로 이루어진다.
둘 다 서로 다른 상황에서 사용되는 패턴이며, 경우에 따라 함께 사용될 수도 있다. 예를 들어,
팩토리 메서드 패턴을 사용하여 객체 생성을 캡슐화하고, 생성된 객체에 대해 전략 패턴을 사용하여 다양한 알고리즘을 적용할 수 있다.
'CS' 카테고리의 다른 글
[Design Pattern] 가교 패턴(브릿지 패턴, Bridge Pattern) (0) | 2023.10.26 |
---|---|
[Design Pattern] 퍼사드(Facade) 패턴 (0) | 2023.10.26 |
[Design Pattern] 팩토리 메서드(Factory method pattern) (1) | 2023.10.23 |
[Spring] Bean의 생명주기 및 Scope (0) | 2023.10.20 |
[JAVA] UML(Unified Modeling Language) (1) | 2023.10.19 |