프로그래밍/java

[java] 템플릿 패턴_추상클래스 활용

znvlcm 2021. 5. 31. 16:59

템플릿 패턴이란?

추상클래스를 활용한 디자인 패턴이다. 

 

 

템플릿 패턴의 템플릿 메소드

추상메소드, 구현메소드 등으로 코드의 흐름, 즉 시나리오를 정의한 메소드이다. 

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