본문 바로가기

스프링

[Spring] 디자인 패턴 - 템플릿 메서드 패턴

참고 1. 스프링-핵심-원리-고급편, 김영한

템플릿 메서드 패턴

프로젝트에서 중복된 코드들을 개선하기 위한 패턴이다. 각 코드에서 변하는 부분(중복되지 않는 부분)과 변하지 않는 부분(중복되는 부분)을 파악 후 변하지 않는 부분을 템플릿(추상 클래스)에 몰아 넣고 변하는 부분은 오버라이딩하는 디자인 패턴이다.

예시

1. 아래와 같이 처음과 끝에 "Hello Start"와 "Hello End"를 고정적으로 출력해주는 클래스들이 있다.

public class ex1 {
        System.out.println("Hello Start"); //중복
 		
        System.out.Println("this is ex1");
        
        System.out.println("Hello End"); //중복
}

public class ex2 {
        System.out.println("Hello Start"); //중복
 		
        System.out.Println("this is ex2");
        
        System.out.println("Hello End"); //중복
}

public class ex3 {
        System.out.println("Hello Start"); //중복
 		
        System.out.Println("this is ex3");
        
        System.out.println("Hello End"); //중복
}

 

 

2. 아래와 같이 고정적으로 바뀌지 않는 부분을 특정 함수(excute)에 몰아주고, 중간에 바뀌는 부분들은 추상 함수로 넣어준다.

public abstract class TemplateWithHello {
    public void execute() {
    	//바뀌지 않는 부분(중복되는 부분)
        System.out.println("Hello Start");        
 		
        //계속 바뀌는 부분은 상속을 통해 재정의
        call();
        
        //바뀌지 않는 부분
        System.out.println("Hello End");
    }
    
    protected abstract void call();
}

 

3. 기존의 클래스들을 템플릿을 상속받아 call 부분을 오버라이딩 해준다.

public class ex1 extends TemplateWithHello{
    @Override
    protected void call() {
        log.info("this is ex1");
    }
}

public class ex2 extends TemplateWithHello{
    @Override
    protected void call() {
        log.info("this is ex2");
    }
}

public class ex3 extends TemplateWithHello{
    @Override
    protected void call() {
        log.info("this is ex3");
    }
}

 

4. 이후 실행은 excute()로 해주면 된다.

TemplateWithHello ex1 = new ex1();
TemplateWithHello ex2 = new ex2();
TemplateWithHello ex3 = new ex3();

ex1.execute();
ex2.execute();
ex3.execute();

 

5. 아래와 같이 익명 클래스로도 가능하다.

TemplateWithHello ex4 = new TemplateWithHello() {
    @Override
    protected void call() {
        log.info("this is ex4");
    }
};

ex4.execute();