[패턴]TemplateMethodPattern

[패턴]TemplateMethodPattern

패턴개요

특정 프로세스를 정의하는 Template Class를 만들고,
변하는 부분과 그렇지 않는 부분을 나누어,
상황에 따라 변할 수 있는 부분은 abstract 메소드로 만든다.

이를 상속받는 각 구현체에서 abstract 메소드를 정의 하고,
공통된 인터페이스 메소드를 호출하여
코드의 중복없이 유사한 기능을 하는 여러가지 케이스를 만들어 낸다.

이 패턴은 대부분의 결재문서 구현시 사용할 수 있으며,
동일 로직의 중복을 제거할 수 있으며, 이후 확장도 용이하다.

핵심은, 변하는 프로세와 그렇지 않는 프로세스를 분리해 내는 것이다.

다음의 예제는 "생성", "수정", "삭제" 요청서가 있다고 가정하고,
전반적으로 공통된 결재 프로세스를 모델링 한 것이다.
전반적으로 공통된 부분은 매번 코딩할 필요가 없다.

소스코드

package study.patterns.templatemethod;

/*
 * 모든 결재문서에 대한 공통 메소드 정의
 * 예를 들면, 모든 결재문서는 approve() 라는 메소드가 필요하다.
 */
interface ApprovalService {

	// 결재하기
	public void approve();
}



/*
 * 결재문서의 Template 정의 Class
 *
 * 전반적으로 공통된 프로세스들을 정의하고,
 * 요청서별로 변할 수 있는 부분은 abstract method로 정의한다.
 *
 */
abstract class ApprovalTemplate implements ApprovalService {

	private void prepareApproval() {
		System.out.println( "1. 결재준비" );
	}


	private void updateApprovalLine() {
		System.out.println( "2. 결재선 갱신" );
	}


	// 3단계는 각 요청서 별로 다를 수 있다.
	public abstract void updateBusiness();


	private void finalizeApproval() {
		System.out.println( "4. 결재 마무리" );
	}


	/**
	 * 모든 결재 프로세스의 Template은 다음과 같다.
	 * 1~4단계를 거치며, 3단계는 각 요청서마다 달라질 수 있다. 
	 */
	@Override
	public void approve() {
		this.prepareApproval();		// 1단계
		this.updateApprovalLine();	// 2단계
		this.updateBusiness();		// 3단계
		this.finalizeApproval();	// 4단계
	}
}



/*
 * 생성 요청서
 *
 * 생성요청서에서 다른 부분에 대해서만 코딩한다.
 */
class CreateRequestApproval extends ApprovalTemplate {

	@Override
	public void updateBusiness() {
		System.out.println( "3. 생성요청서 갱신" );
	}

}



/*
 * 수정 요청서
 *
 * 수정요청서에서 다른 부분에 대해서만 코딩한다.
 */
class ModifyRequestApproval extends ApprovalTemplate {

	@Override
	public void updateBusiness() {
		System.out.println( "3. 수정요청서 갱신" );
	}
}



/*
 * 삭제 요청서
 *
 * 삭제 요청서에서 다른 부분에 대해서만 코딩한다.
 */
class DeleteRequestApproval extends ApprovalTemplate {

	@Override
	public void updateBusiness() {
		System.out.println( "3. 삭제요청서 갱신" );
	}
}



/*
 * 결재 프로그램
 */
public class ApprovalRunner {

	public static void main( String[] args ) {
		ApprovalService creationRequest = new CreateRequestApproval();
		ApprovalService modificationRequest = new ModifyRequestApproval();
		ApprovalService deletionRequest = new DeleteRequestApproval();

		// 어떤 요청서든, ApprvalTemplate을 구현한 요청서는
		// 모두 ApprovalService 인터페이스로사용법이 통일된다.
		System.out.println( "생성요청서 결재과정===================" );
		creationRequest.approve();
		System.out.println( "" );

		System.out.println( "수정요청서 결재과정===================" );
		modificationRequest.approve();
		System.out.println( "" );

		System.out.println( "삭제요청서 결재과정===================" );
		deletionRequest.approve();
		System.out.println( "" );
	}
}

실행결과

생성요청서 결재과정===================
1. 결재준비
2. 결재선 갱신
3. 생성요청서 갱신
4. 결재 마무리

수정요청서 결재과정===================
1. 결재준비
2. 결재선 갱신
3. 수정요청서 갱신
4. 결재 마무리

삭제요청서 결재과정===================
1. 결재준비
2. 결재선 갱신
3. 삭제요청서 갱신
4. 결재 마무리

Written with StackEdit.