[ 목차 ]
안녕하세요. 오늘은 JAVA 디자인패턴 중 스트래티지(Strategy) 패턴에 대해서 작성해 보겠습니다.
스트래티지(Strategy) 패턴 이란?
스트래티지 패턴은 알고리즘 군을 정의한 다음 각각을 캡슐화하여, 동적으로 상황에 따라 특정한 알고리즘을 선택하고 이용할 수 있게 해주는 행동 패턴입니다. 이 패턴을 사용하면 알고리즘을 사용하는 클라이언트와 독립적으로 알고리즘을 수정하거나 새로운 알고리즘을 추가할 수 있습니다.
스트래티지(Strategy) 패턴 구현 방법
스트래티지 패턴을 구현하기 위해 다음 요소들이 필요합니다.
- Strategy 인터페이스: 알고리즘 군에 대한 공통 인터페이스입니다.
- ConcreteStrategy 클래스: Strategy 인터페이스를 구현하는 각 알고리즘에 대한 클래스입니다.
- Context 클래스: 전략적으로 선택된 알고리즘을 사용해 작업을 처리하는 클래스입니다. 이 클래스는 Strategy 인터페이스의 참조를 사용해 알고리즘이 실행됩니다.
// Strategy 인터페이스
public interface SortingStrategy {
int[] sort(int[] numbers);
}
// ConcreteStrategy 클래스
public class BubbleSortStrategy implements SortingStrategy {
public int[] sort(int[] numbers) {
// 버블 정렬 구현
int[] sortedNumbers = Arrays.copyOf(numbers, numbers.length);
for (int i = 0; i < sortedNumbers.length; i++) {
for (int j = 1; j < sortedNumbers.length - i; j++) {
if (sortedNumbers[j - 1] > sortedNumbers[j]) {
int temp = sortedNumbers[j - 1];
sortedNumbers[j - 1] = sortedNumbers[j];
sortedNumbers[j] = temp;
}
}
}
return sortedNumbers;
}
}
// Context 클래스
public class SortingContext {
private SortingStrategy strategy;
public void setStrategy(SortingStrategy strategy) {
this.strategy = strategy;
}
public int[] executeStrategy(int[] numbers) {
return strategy.sort(numbers);
}
}
// 클라이언트 코드
public class Main {
public static void main(String[] args) {
int[] inputNumbers = new int[]{5, 3, 1, 4, 2};
SortingContext sortingContext = new SortingContext();
// 전략 설정 및 실행
sortingContext.setStrategy(new BubbleSortStrategy());
int[] sortedNumbers = sortingContext.executeStrategy(inputNumbers);
System.out.println(Arrays.toString(sortedNumbers)); // 출력: [1, 2, 3, 4, 5]
}
}
스트래티지(Strategy) 패턴의 장단점
장점
- 동일한 문제에 대해 여러 가지 해결책이 존재하는 경우 구조화된 방법으로 알고리즘을 캡슐화할 수 있습니다.
- 알고리즘을 교체하거나 확장하는 경우 독립적으로 관리 가능합니다.
- 클라이언트 및 Context 클래스와 알고리즘 간의 의존 관계를 분리하므로 유지하기 쉬워집니다.
단점
- 인터페이스를 구현하는 특정 알고리즘 개수만큼 클래스가 생성됩니다. 이로 인해 코드 복잡성이 높아질 수 있습니다.
- 클라이언트는 context를 통해 선택된 전략에 따라 겉으로 드러나는 동작이 다른 인스턴스를 다루게 됩니다.
스트래티지(Strategy) 패턴의 활용 예
스트래티지 패턴은 여러 상황에서 사용할 수 있습니다.
- 다양한 정렬 알고리즘을 제공하는 메소드를 구현할 때 (예: 버블 정렬, 퀵 정렬, 병합 정렬 등)
- 여러 압축 기술을 지원하는 애플리케이션을 개발할 때 (예: ZIP, RAR, 7z 등)
- 판매 시스템에서 다양한 할인 전략을 사용하여 주문을 관리할 때
- 경로 찾기 알고리즘을 선택할 수 있는 지도 애플리케이션에서 최단 거리, 최소 시간, 최소 비용 등의 전략에 따라 결과를 제공할 때.
스트래티지 패턴을 사용하면 이러한 전략이 구현되어 있는 클라이언트 코드와 각 알고리즘 간의 결합을 줄이기 때문에, 프로그램의 유지 관리 및 확장성이 용이해집니다.
2023.07.12 - [JAVA] - 디자인패턴 - 팩토리(Factory) 패턴
2023.07.12 - [JAVA] - 디자인패턴 - 팩토리(Factory) 패턴
2023.07.12 - [JAVA] - 디자인패턴 - 어댑터(Adapter) 패턴
2023.07.12 - [JAVA] - JAVA 디자인패턴 - 싱글톤(Singleton) 패턴
2023.07.13 - [JAVA] - JAVA 디자인패턴 - 옵저버(Observer) 패턴
2023.07.13 - [JAVA] - JAVA 디자인패턴 - 데코레이터(Decorator) 패턴
'JAVA' 카테고리의 다른 글
JAVA 디자인패턴 - 컴포지트(Composite) 패턴 (0) | 2023.07.17 |
---|---|
JAVA 디자인패턴 - 템플릿 메서드(Template Method) 패턴 (0) | 2023.07.16 |
JAVA 디자인 패턴 - 커맨드(Command) 패턴 (0) | 2023.07.14 |
JAVA 디자인패턴 - 프록시(Proxy) 패턴 (0) | 2023.07.14 |
JAVA 디자인패턴 - 데코레이터(Decorator) 패턴 (0) | 2023.07.13 |
댓글