[디자인 패턴] 06. Strategy 패턴

다나·2023년 9월 23일
0

디자인 패턴

목록 보기
6/8

PART 1. Strategy 패턴 다이어그램

Strategy 패턴은 해당 이름 뜻에서도 알 수 있듯이 전략과 관련된 패턴입니다.

즉, 전략(알고리즘)을 바꿔서, 같은 문제를 다른 방법으로 해결하기 쉽게 만들어주는 패턴입니다.

여기에서 살펴보아야 할 것은 Context 클래스입니다.

Context 클래스가 전략(알고리즘)을 선택적으로 교체할 수 있도록 합니다.

전략(알고리즘)을 선택적으로 교체해야 하는 상황을 살펴보겠습니다.

  1. 알고리즘을 개량해서 더 빠르게 만들고 싶은 경우
  • Strategy패턴을 이용하면, Strategy 역의 인터페이스를 변경하지 않고, ConcreteStrategy역만 수정하면 됩니다.
  1. 원래 알고리즘과 개량한 알고리즘의 속도를 비교하고 싶은 경우

  2. 알고리즘의 동작이 런타임에 실시간으로 교체 되어야 하는 경우

  • 만약에 메모리가 적은 환경인 경우 속도는 느리지만, 메모리를 절약하는 전략을 사용하고, 메모리가 많은 환경에서는 속도가 빠르지만 메모리를 더 쓰는 전략을 사용할 수 있습니다.

여기에서 가장 중요하게 Strategy 패턴를 사용해야 하는 경우는 3번과 같이 알고리즘의 동작이 런타임에 실시간으로 교체되어야 하는 경우라고 할 수 있습니다.

즉, 객체가 할 수 있는 행위들 각각을 전략으로 만들어 놓고, 동적으로 행위의 수정이 필요한 경우 전략을 바꾸는 것만으로 행위의 수정이 가능하도록 만든 패턴입니다.
(출처 : https://victorydntmd.tistory.com/292)


PART 2. Strategy 패턴 다이어그램과 Builder 패턴 다이어그램 비교

  1. Strategy 패턴 다이어그램
  1. Builder 패턴 다이어그램

이전 글에서 Builder 패턴에 대해서 다루어보았습니다.

만약에 Builder 패턴에서 Client가 없다면, Strategy 패턴 다이어그램과 Builder 패턴 다이어그램은 굉장히 유사한 구조라고 할 수 있습니다.

따라서, 해당 패턴을 비교하기 위해서는 Context와 Director의 역할을 잘 생각하면 됩니다.

  • Context 클래스전략(알고리즘)을 선택적으로 교체할 수 있도록 한다.
  • director 클래스builder의 복잡도를 낮추기 위한 것입니다.

PART 3. Strategy 패턴이 사용되는 예시

  • Collections의 sort() 메서드에 의해 구현되는 compare() 메서드에서 사용됩니다.

비교하려는 전략 알고리즘을 변경하여, 원하는 전략으로 선택적인 교체가 가능합니다.

class StrategyInJava {
    public static void main(String[] args){
        List<Integer> numbers = new ArrayList<>();
        numbers.add(1);
        numbers.add(2);

        Collections.sort(numbers, new Comparator<Integer>()){
            @Override //비교하는 전략 알고리즘을 지정하여, 전략 객체 할당
            public int compare(Integer o1, Integer o2) {
                return o1 - o2;
            }
        }
    }
}
  • 더 나아가서, 위의 예시뿐만 아니라 시간을 비교해서 정렬하는 경우와 같이 여러 상황에 맞추어서 전략을 변경할 수도 있습니다.

출처 1 : https://inpa.tistory.com/entry/GOF-💠-전략Strategy-패턴-제대로-배워보자#comparator

출처 2 : https://m.blog.naver.com/writer0713/221896418002

profile
컴퓨터공학과 학생이며, 백엔드 개발자입니다🐰

0개의 댓글