참고 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();
'스프링' 카테고리의 다른 글
[Spring] 디자인 패턴 - 전략 패턴 개선하기 (0) | 2024.04.09 |
---|---|
[Spring] 디자인 패턴 - 전략 패턴 (0) | 2024.04.09 |
[Spring] 동시성 문제 - ThreadLocal로 개선 (0) | 2024.04.07 |
[Spring]IoC(Inversion of Control)와 DI (0) | 2024.03.28 |
[Spring] 객체 지향 설계 SOLID 개념과 적용 예시 (0) | 2024.03.25 |