템플릿 메서드 패턴
템플릿 메서드 패턴의 의도
작업에서 알고리즘의 골격을 정의하고 일부 단계를 하위 클래스로 연기합니다. 템플릿 메서드를 사용하면 하위 클래스가 알고리즘의 구조를 변경하지 않고도 알고리즘의 특정 단계를 재정의할 수 있습니다.
- 로깅 부분은 변하지 않지만, 비즈니스 로직은 변경.
- 이 둘을 분리해서 모듈화 해야 한다.
@Slf4j
public abstract class AbstractTemplate {
public void execute() {
long startTime = System.currentTimeMillis();
// Logic Start
call(); // 상속
// Logic End
long endTime = System.currentTimeMillis();
long result = endTime - startTime;
log.info("result = {}", result);
}
protected abstract void call();
}
템플릿이라는 틀에 변하지 않는 부분을 배치한다.
일부 변하는 부분을 별도로 호출하여 해결
AbstractTemplate
에서 변하지 않는 시간 측정 로직을 배치.
변하는 부분은 call()
통해 상속과 오버라이딩을 통해 처리한다.
@Slf4j
public class SubClassLogic1 extends AbstractTemplate {
@Override
protected void call() {
log.info("Logic 1 Start");
}
}
@Slf4j
public class SubClassLogic2 extends AbstractTemplate {
@Override
protected void call() {
log.info("Logic 2 Start");
}
}
실행 결과
@Test
void templateMethodV1() {
AbstractTemplate t1 = new SubClassLogic1();
t1.execute();
AbstractTemplate t2 = new SubClassLogic2();
t2.execute();
}
16:31:39.590 [Test worker] INFO hello.advanced.trace.mytemplate.SubClassLogic1 - Logic 1 Start
16:31:39.593 [Test worker] INFO hello.advanced.trace.mytemplate.AbstractTemplate - result = 4
16:31:39.594 [Test worker] INFO hello.advanced.trace.mytemplate.SubClassLogic2 - Logic 2 Start
16:31:39.594 [Test worker] INFO hello.advanced.trace.mytemplate.AbstractTemplate - result = 0
자바 람다식을 이용하여 간소화
@Test
void templateMethodV2() {
AbstractTemplate t1 = () -> log.info("Logic 1 Start");
t1.execute();
AbstractTemplate t2 = () -> log.info("Logic 2 Start");
t2.execute();
}
템플릿 메서드 패턴의 정의
템플릿 메서드 패턴은 알고리즘 골격을 정의한다. 템플릿 메서드를 사용하면 알고리즘의 일부 단계를 서브클래스에서 구현할 수 있으며, 알고리즘의 구조는 그대로 유지하면서 알고리즘의 특정 단계를 서브클래스에서 재정의 가능하다.
템플릿 메서드는 일련의 단계로 알고리즘을 정의한 메서드이다. 여러 단계 가운데 하나 이상의 단계가 추상메소드로 정의되며, 그 추상 메서드는 서브클래스에소 구현된다. 이러면 서브클래스가 일부분의 구현을 처리하레 하면서 알고리즘의 구조는 바꾸지 않아도 된다.
부모 클래스에 부가적인 로직을 정의하고, 변경이 자주 발생하는 로직은 자식클래스에 정의한다.
상속, 오버라이딩을 통해 문제를 해결한다.
자식클래스에서는 부모클래스의 기능을 전혀 사용하지 않는다. 그럼에도 불구하고 템플릿 메서드 패턴을 위해 부모클래스와 자식클래스가 강결합된다.
자식클래스 입장에서는 부모클래스의 기능을 전혀 사용하지 않지만, 부모클래스를 알아햐 한다. 잘못된 의존관계 때문에 부모클래스를 수정하면 자식클래스에 영향을 줄 수 있다.
참고
'Java > Design Pattern' 카테고리의 다른 글
Strategy Pattern (0) | 2022.12.02 |
---|
댓글