목적
같은 종류의 작업을 하는 알고리즘을 정의, 각 알고리즘을 캡슐화
알고리즘들을 서로 바꿔 사용할 수 있도록 함
스트래티지 패턴은 알고리즘을 사용하는 클라이언트로 부터 독립적으로 알고리즘을 바꿔서 적용시킬 수 있도록 함
요약
- 문제: 알고리즘의 다른 버전이 존재해서, 중복으로 존재하거나 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());
}
}
'컴퓨터과학 > 디자인패턴' 카테고리의 다른 글
[디자인패턴] 반복자 패턴 (Iterator Pattern) (0) | 2021.10.18 |
---|---|
[디자인패턴] 싱글턴 패턴 (Singleton Pattern) (0) | 2021.10.18 |
[디자인패턴] 팩토리 패턴 (Factory Pattern) (0) | 2021.10.18 |
[디자인패턴] 데코레이터 패턴 (Decorator Pattern) (0) | 2021.10.14 |
[디자인패턴] 옵저버 패턴 (Observer Pattern) (0) | 2021.10.13 |
댓글