로그 기능을 핵심 기능 내에 구현하면(예를 들어, 모든 메서드의 실행 시간을 측정하여 로깅하는) 핵심 기능을 구현할 때마다 로그 기능을 반복적으로 작성해야 한다는 번거로움이 있다.
좋은 설계의 특징 중 하나는, 변하는 부분(핵심 기능)과 변하지 않는 부분(부가 기능)을 분리하는 것이다.
템플릿 메서드 패턴을 통해 변하는 부분과 변하지 않는 부분을 분리하여 모듈화 할 수 있다.
@Slf4j
public abstract class AbstractTemplate {
public void execute() {
long startTime = 시작시간을 얻어온다();
call(); // 핵심 기능
long endTime = 종료시간을 얻어온다();
}
protected abstract void call();
}
부가 기능을 몰아둘 추상 템플릿 클래스이다.
public class SubjectClass1 extends AbstractTemplate{
@Override
protected void call() {
핵심 기능 구현;
}
}
public class SubjectClass2 extends AbstractTemplate{
@Override
protected void call() {
핵심 기능 구현;
}
}
추상 템플릿 클래스를 구현한 구체 클래스이다.
void run() {
AbstractTemplate subject1 = new SubjectClass1();
AbstractTemplate subject2 = new SubjectClass2();
subject1.execute();
subject2.execute();
}
다형성과 상속을 사용해서 템플릿 메서드를 구현할 수 있다.
핵심 기능이 되는 것은 추상 템플릿 클래스의 call()
메서드를 오버라이드하여 구체 클래스에서 구현한다.
템플릿 메서드 패턴의 목적
작업에서 알고리즘의 골격을 정의하고 일부 단계를 하위 클래스로 연기한다. 따라서 하위 클래스의 알고리즘을 변경하지 않고 알고리즘의 특정 단계를 재정의 할 수 있다.
-GOF
템플릿 메서드와 비슷한 역할을 하는데 상속의 단점을 제거하자! -> 전략 패턴
참고자료
Spring 핵심 원리 - 고급편(인프런, 김영한)