템플릿 패턴이란?
추상클래스를 활용한 디자인 패턴이다.
템플릿 패턴의 템플릿 메소드
추상메소드, 구현메소드 등으로 코드의 흐름, 즉 시나리오를 정의한 메소드이다.
final선언으로 상속받은 자식클래스가 임의로 시나리오를 변경할 수 없도록 한다.
보통 프레임워크에서 많이 활용한다.
예를 들어 다양한 정렬 알고리즘을 구현하고 시간과 비교횟수를 비교하고자 한다.
시간과 출력등을 각처리 과정에서 하면 일단 동일한 내용을 여러번쓰게 되고,
나중에 해당 내용을 수정할 때 모든 클래스의 수정을 해야한다. 동일한내용임에도 불구하고
이 때, 정렬 알고리즘 부분만 다르므로 추상클래스화하고
시간이나 정렬 내용을 출력하는 공통 내용을 템플릿 메소드로 구현하면 간편하다.
import java.util.Arrays;
/**
* 정렮클래스의 추상클래스
*
*
* @author "Amy"
*
*/
public abstract class AbstractSort {
protected int cnt =0;
protected String sortName = null;
public final int[] sort (int[] array) {
cnt =0;
long start = System.nanoTime();
int[] output = Arrays.copyOf(array, array.length);
sortProcess(output);
long end = System.nanoTime();
System.out.printf("%s 정렬처리시간 : %d나노초 \t 비교횟수 : %d 회, 입력데이터 : %s, 결과: %s \r\n",sortName, (end-start),cnt, Arrays.toString(array), Arrays.toString(output));
return array;
}
protected abstract int [] sortProcess (int[] array);
protected void swap (int[] array,int i, int j) {
int tmp = array[j];
array[j] = array[i];
array [i] = tmp;
}
}
package amy.practice.Algorithm.School.Sort;
public class SelectionSortTest extends AbstractSort{
protected int[] sortProcess(int[] array) {
int i = 0;
while (i < array.length-1) {
int minIdx = i;
int min = array[i];
for(int j = i+1; j < array.length; j++) {
cnt++;
if( min > array[j] ) {
minIdx = j;
min = array[j];
}
}
if(i != minIdx) {
swap( array, i, minIdx);
}
i++;
}
return array;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] array = {50,10,20,40,30};
SelectionSortTest s = new SelectionSortTest();
s.sortName = "선택정렬";
s.sort(array);
int[] array2 = {10,20,30,40,50};
s.sort(array2);
int[] array3 = {50,40,30,20,10};
s.sort(array3);
}
}
728x90
'프로그래밍 > java' 카테고리의 다른 글
[spring] jpa auditing기능 (0) | 2022.01.08 |
---|---|
[spring] 롬복 slf4j에서 에러 (0) | 2022.01.07 |
[spring] 주요 기능 IoC (0) | 2021.07.27 |
[java] 추상클래스(abstract class) (0) | 2021.05.31 |
[java] 직렬화 serialization와 Externalizable 외부화 (0) | 2021.05.28 |