본문 바로가기

개인공부/디자인패턴

템플릿 메서드 패턴

반응형

기본 로직

 

템플릿 메서드 패턴은 여러 반복되는 메서드들을 줄여 줄 수 있는 패턴이다.

 

/// 고정로직 ///

/// 비즈니스 로직 ///

/// 고정로직 ///

다음과 같이 고정로직이 반복되고 비즈니스 로직만 바뀌는 경우에 사용할 수 있는 패턴이다.

 

다음과 같은 예시를 알아보자.

 

    @Test
    void myTemplateMethodPattern() {
        proccess1();
        proccess2();
    }

    private void proccess1() {
        // 고정로직 //
        long start = System.currentTimeMillis();

        // 비지니스 로직 //
        System.out.println("TemplateMethodTest.proccess1");

        // 고정로직 //
        long end = System.currentTimeMillis();
        long result = end - start;
        System.out.println("result = " + result);
    }

    private void proccess2() {
        // 고정로직 //
        long start = System.currentTimeMillis();

        // 비지니스 로직 //
        System.out.println("TemplateMethodTest.proccess2");

        // 고정로직 //
        long end = System.currentTimeMillis();
        long result = end - start;
        System.out.println("result = " + result);
    }

 

다음 코드를 보자 위의 예제를 가장 간단하게 나타낼 수 있는 코드의 실행시간을 나타내는 가장 간단한 로직이다.

 

myTemplateMethodPattern은 process1 , 2 를 호출 시킨다. 하지만 고정로직이 반복되는것을 고칠 수 없을까? 생각해본다. 뭐 정답은 없겠지만 이러한 방법을 고민해서 해결하는 패턴이 템플릿 메서드 패턴이다.

 

다음은 템플릿 메서드 패턴을 구글에서 이미지를 가져와서 확인해보자.

 

 

AbstractTemplate 라는 추상 메서드를 구성하고, 각각의 로직 A, B가 추상메서드를 구현하는 것으로 비즈니스로직을 구성하고 템플릿에서는 고정되는 템플릿을 가져가는게 핵심인 패턴이다.

 

바로 구현해보자.

 

AbstractTemplate 에 해당되는 템플릿을 구현한다.

// 추상메서드 템플릿 구현
public abstract class AbstracTemplate {
	public void execute() {
    	// 고정 로직
        long start = System.currentTimeMillis();
        
        // 비즈니스 로직
        call();
        
        // 고정 로직
        long end = System.currentTimeMillis();
        long result = end - start;
        System.out.println("result = " + result);
    }
}

 

이제 call에 해당하는 비즈니스로직 process1과 process2를 구현한다.

public class Implementation1 extends AbstractTemplate {
	@Override
    protected void call() {System.out.println("비즈니스 로직1 실행"); }
}

public class Implementation2 extends AbstractTemplate {
	@Override
    protected void call() {System.out.println("비즈니스 로직2 실행"); }
}

 

마지막으로는 Client에서 호출한다.

 

// Main
@Test
void templateMethodClinet() {
	AbstractTemplate template1 = new Implementation1();
    template1.execute();
    
    AbstractTemplate template2 = new Implementation2();
	template2.execute();
}

 

이상 간단하게 템플릿 메서드 패턴을 구현해 보았다.

반응형