ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 전략 디자인 패턴
    자바 2024. 2. 6. 10:50

    전략 디자인 패턴이란?

    전략 디자인 패턴(Strategy Design Pattern)은 객체 지향 소프트웨어 디자인에서 사용되는 패턴 중 하나로, 알고리즘을 정의하고 각각의 알고리즘을 캡슐화하여 서로 교환 가능하도록 만듭니다. 이 패턴은 알고리즘을 독립적으로 변경하고 클라이언트에 영향을 주지 않고 새로운 알고리즘을 추가할 수 있도록 합니다.

     

    전략 패턴은 OOP의 집합체

    GoF의 디자인 패턴 책에서는 전략 패턴을 다음과 같이 정의한다.

    1. 동일 계열의 알고리즘군을 정의하고 
    2. 각각의 알고리즘을 캡슐화하여 
    3. 이들을 상호 교환이 가능하도록 만든다.
    4. 알고리즘을 사용하는 클라이언트와 상관없이 독립적으로
    5. 알고리즘을 다양하게 변경할 수 있게 한다. 

    예시

    1. 간단한 정렬 알고리즘을 다양한 전략으로 교체할 수 있는 상황을 자바 코드로 표현

    // 전략 인터페이스
    interface SortingStrategy {
        void sort(int[] array);
    }
    
    // 구체적인 전략 클래스들
    class BubbleSort implements SortingStrategy {
        @Override
        public void sort(int[] array) {
            // Bubble sort implementation
            System.out.println("Bubble Sort");
        }
    }
    
    class QuickSort implements SortingStrategy {
        @Override
        public void sort(int[] array) {
            // Quick sort implementation
            System.out.println("Quick Sort");
        }
    }
    
    class MergeSort implements SortingStrategy {
        @Override
        public void sort(int[] array) {
            // Merge sort implementation
            System.out.println("Merge Sort");
        }
    }
    
    // 컨텍스트 클래스
    class SortingContext {
        private SortingStrategy sortingStrategy;
    
        public SortingContext(SortingStrategy sortingStrategy) {
            this.sortingStrategy = sortingStrategy;
        }
    
        public void setSortingStrategy(SortingStrategy sortingStrategy) {
            this.sortingStrategy = sortingStrategy;
        }
    
        public void performSort(int[] array) {
            sortingStrategy.sort(array);
        }
    }
    
    // 클라이언트 코드
    public class StrategyPatternExample {
        public static void main(String[] args) {
            int[] arrayToSort = {5, 2, 9, 1, 5};
    
            // 초기 전략: Bubble Sort
            SortingStrategy initialStrategy = new BubbleSort();
            SortingContext sortingContext = new SortingContext(initialStrategy);
    
            // 클라이언트가 원하는 전략으로 교체
            sortingContext.performSort(arrayToSort);
    
            // 새로운 전략: Quick Sort
            SortingStrategy newStrategy = new QuickSort();
            sortingContext.setSortingStrategy(newStrategy);
            sortingContext.performSort(arrayToSort);
        }
    }

     

    2. 자바의 sort를 compare 메소드 override로 구현

    class StrategyInJava {
        public static void main(String[] args) {
            List<Integer> numbers = new ArrayList<>();
            numbers.add(2);
            numbers.add(1);
            numbers.add(3);
            numbers.add(5);
            numbers.add(4);
    
            // sort 메서드의 매개변수로 익명 클래스로 Comparator 객체를 인스턴스화하여
            // 그 안의 compare 메서드 동작 로직(ConcreteStrategy)를 직접 구현하여 할당하는 것을 볼 수 있다.
            Collections.sort(numbers, new Comparator<Integer>() {
                @Override
                public int compare(Integer o1, Integer o2) {
                    return o1 - o2;
                }
            });
    
            System.out.println(numbers);
        }
    }

     

    전략 패턴 특징

    전략 패턴 사용 시기

    • 전략 알고리즘의 여러 버전 또는 변형이 필요할 때 클래스화를 통해 관리
    • 알고리즘 코드가 노출되어서는 안 되는 데이터에 액세스 하거나 데이터를 활용할 때 (캡슐화)
    • 알고리즘의 동작이 런타임에 실시간으로 교체 되어야 할때

     

    전략 패턴 주의점

    1. 알고리즘이 많아질수록 관리해야할 객체의 수가 늘어난다는 단점이 있다.
    2. 만일 어플리케이션 특성이 알고리즘이 많지 않고 자주 변경되지 않는다면, 새로운 클래스와 인터페이스를 만들어 프로그램을 복잡하게 만들 이유가 없다.
    3. 개발자는 적절한 전략을 선택하기 위해 전략 간의 차이점을 파악하고 있어야 한다. (복잡도 ↑)

     

    '자바' 카테고리의 다른 글

    SQL 튜닝  (3) 2024.03.05
    Builder 디자인 패턴  (1) 2024.02.13
    TDD  (2) 2024.01.22
    Spring boot3에서 Swagger Springdoc 사용하기 - maven  (1) 2024.01.09
    java 예외처리 throws와 try ~ catch 차이점  (1) 2023.12.13
Designed by Tistory.