안녕하세요 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()를 수행한다.



- 정 리

전략 패턴을 사용하면?


> 관련 알고리즘 집합을 형성할 수 있습니다.


> 알고리즘의 선택 혹은 대체가 가능합니다.


> 알고리즘 객체 수가 증가 합니다.



고생하셨습니다 좋은 하루되세요 :)


+ Recent posts