패턴개요
특정 프로세스를 정의하는 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.