본문 바로가기
컴퓨터과학/디자인패턴

[디자인패턴] 스트래티지 패턴 (Strategy Pattern)

by 윤호 2021. 10. 13.

목적

같은 종류의 작업을 하는 알고리즘을 정의, 각 알고리즘을 캡슐화

알고리즘들을 서로 바꿔 사용할 수 있도록 함

스트래티지 패턴은 알고리즘을 사용하는 클라이언트로 부터 독립적으로 알고리즘을 바꿔서 적용시킬 수 있도록

요약

  • 문제: 알고리즘의 다른 버전이 존재해서, 중복으로 존재하거나 if문을 이용해서 선택해야 함 -> OCP 위반
  • 해결: 중복을 공통화시키고, 실행 시점에 맞는 알고리즘을 호출하도록 함 (상속 또는 인터페이스 활용)
  • 결과: 수정할 경우 strategy를 추가하고, 나머지는 변경하지 않아도 됨.

구성

  • Context 클래스
    • 캡슐화된 알고리즘을 멤버 변수로 포함
    • 캡슐화된 알고리즘을 교환할 수 있음
  • Strategy 클래스 (인터페이스)
    • 컴파일 시점에서 사용하는 캡슐화된 알고리즘을 나타냄
    • 실제 구현은 하위 Strategy(N) 클래스에 위임함
  • Strategy(N) 클래스
    • 실행 시점에 적용될 알고리즘을 캡슐화
    • Context에서 실행될 알고리즘을 구현

 

스트래티지 패턴을 이용한 정렬 프로그램

  • 정렬 알고리즘은 버블소트로 공통되지만, 어떤 타입을 정렬하느냐에 따라 조금씩 다른 부분이 있음

 

// Main 함수에서 Sorter을 사용하는 부분

Sorter sorter = new Sorter(new CompareFileName());
System.out.println("\n\n파일 이름으로 정렬된 리스트");
sorter.bubbleSort(fileLists);

 

// 스트래티지 패턴의 Context

public class Sorter {
    Comparable compare;

    public Sorter(Comparable compare) {
        this.compare = compare;
    }

    public void setComparable(Comparable compare) {
        this.compare = compare;
    }

    public void bubbleSort(Object[] data) {
        for (int i = 0; i < data.length - 1; i++) {
            for (int j = 0; j < data.length - i - 1; j++) {
                if (compare.compareTo(data[j], data[j+1]) > 0) { // swap
                    Object temp = data[j];
                    data[j] = data[j + 1];
                    data[j + 1] = temp;
                }
            }
        }
    }

}

 

// 스트래티지 패턴의 Strategy

interface Comparable {
    int compareTo(Object o1, Object o2);
}

 

// 스트래티지 패턴의 Strategy(N)

public class CompareFileName implements Comparable {
    @Override
    public int compareTo(Object o1, Object o2) {
        FileInfo f1 = (FileInfo) o1;
        FileInfo f2 = (FileInfo) o2;
        return f1.getName().compareTo(f2.getName());
    }
}

댓글