CS

[Design Pattern] 전략 패턴(Strategy Pattern)

KJihun 2023. 10. 23. 23:00
728x90

전략 패턴(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로 이루어진다.

둘 다 서로 다른 상황에서 사용되는 패턴이며, 경우에 따라 함께 사용될 수도 있다. 예를 들어,

팩토리 메서드 패턴을 사용하여 객체 생성을 캡슐화하고, 생성된 객체에 대해 전략 패턴을 사용하여 다양한 알고리즘을 적용할 수 있다.