안녕하세요 2년차 개발자 진쓰입니다.
전략패턴, Strategy pattern 에 대해서 포스팅 시작하겠습니다.
- 의도
다양한 알고리즘이 있을 때, 이들을 각각의 클래스로 캡슐화하여 만들고, 알고리즘 대체가 가능하도록 하고자 할 때 사용합니다.
- 활용
알고리즘 행위가 조금씩 다를 뿐, 개념적으로 관련된 많은 클래스들이 존재할 때 활용합니다.
알고리즘 변형이 빈번하게 필요한 경우 활용합니다.
예제상황과 코드로 배워보도록 하겠습니다.
- 예제상황
많은 데이터를 검색하려고 한다. 검색을 할 때, 상황에 따라 다양한 정렬알고리즘을
바꿔가면서 적용하려고 한다.
|
- 코드리뷰
코드구성
Sort.java 전략을 바꿀 수 있는 매개체 인터페이스입니다. |
import java.util.List; public interface Sort { public void sort(List <Object> al); } |
MergeSort.java Merge sort 전략 클래스입니다. |
import java.util.List; public class MergeSort implements Sort { @Override public void sort(List<Object> al) { System.out.println("Merge Sort!!!"); } } |
QuickSort.java Quick sort 전략 클래스입니다. |
import java.util.List; public class QuickSort implements Sort { @Override public void sort(List<Object> al) { System.out.println("Quick Sort!!!"); } } |
SortEngine.java Sort sorter는 현재 전략을 가르키는 객체변수이다. Main에서 SortEngine을 생성하고 상황에 따라 전략을 set한다. |
import java.util.ArrayList; import java.util.List; public class SortEngine { private Sort sorter; public SortEngine(Sort ss){ sorter = ss; } public void setSorter(Sort ss){ this.sorter = ss; } public List<Object> search(){ //sort할, array 값을 구성. List list = new ArrayList<Object>(); sorter.sort(list); return list; } } |
.
Main.java 1. Quick sort 전략을 생성하여, SortEngine에 넣고 search() 호출합니다. 2. Merge sort 전략을 생성하고, SortEngin에 넣고 search() 호출합니다. 전략을 바꿔가며(알고리즘을 바꿔가며) serach를 수행중이다. |
public class Main { public static void main(String[] args) { //엔진생성 SortEngine se; //퀵소트 Strategy 생성 Sort st = new QuickSort(); //엔진생성 + 퀵소스 Strategy 설정. se = new SortEngine(st); //엔진이 퀵소트를 실행 se.search(); //머지소트 Strategy 생성 st = new MergeSort(); //엔진에 머지소트 Strategy 설정 se.setSorter(st); //엔진 머지소트 실행 se.search(); } } |
결과화면
- UML
> UML 설명
전략(알고리즘)을 나타내는 Sort 인터페이스가 있고, QuickSort와 MergeSort각각의 전략이 있다.
SortEngine은 Sort를 has a 관계로 가지고있다.
SortEngine의 전략(알고리즘)은 Main에서 setSorter()를 통해서 바뀌게되고
변경된 전략으로 search()를 수행한다.
- 정 리
전략 패턴을 사용하면?
> 관련 알고리즘 집합을 형성할 수 있습니다.
> 알고리즘의 선택 혹은 대체가 가능합니다.
> 알고리즘 객체 수가 증가 합니다.
고생하셨습니다 좋은 하루되세요 :)
'소프트웨어공학 > 디자인패턴 - JAVA' 카테고리의 다른 글
프록시 패턴 (Proxy pattern) (0) | 2020.05.31 |
---|---|
추상 팩토리 패턴 (Abstract factory pattern) (0) | 2020.05.09 |
어댑터 패턴 Adapter Pattern (0) | 2017.06.10 |
상태패턴 State Pattern (0) | 2017.06.10 |
팩토리 메소드 Factory method (0) | 2017.06.10 |