Published on

[ Design Pattern ] Strategy Pattern

Authors
  • avatar
    Name
    유사공대생
    Twitter

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);
    }
}