Template Method Pattern
정의
•
부모 클래스에 알고리즘의 골격인 템플릿 정의
•
변경되는 로직은 자식클래스에 정의
◦
자식클래스가 알고리즘 전체 구조를 변경하지 않고 특정 부분만 재정의
상속과 오버라이딩을 통한 다형성으로 문제 해결
예제
•
부모클래스 (TemplateMethod)
public abstract class AbstractTemplate<T> {
private final LogTrace trace;
public AbstractTemplate(LogTrace trace) {
this.trace = trace;
}
public T execute(String message) {
TraceStatus status = null;
try {
status = trace.begin(message);
// 비즈니스 로직 호출
T result = call();
trace.end(status);
return result;
} catch (Exception e) {
trace.exception(status, e);
throw e;
}
}
protected abstract T call();
}
Java
복사
•
자식클래스
// 자식 클래스 (익명 내부 클래스 사용)
@RestController
@RequiredArgsConstructor
public class OrderControllerV4 {
private final OrderServiceV4 orderService;
private final LogTrace trace;
@GetMapping("/v4/request")
public String request(String itemId) {
AbstractTemplate<String> template = new AbstractTemplate<String>(trace) {
@Override
protected String call() {
orderService.orderItem(itemId);
return "ok";
}
};
return template.execute("OrderController.request()");
}
}
Java
복사
단점
•
◦
자식 클래스가 부모 클래스와 컴파일 시점에 강하게 결합된다.
◦
의존관계에 대한 문제 발생
→ 자식 클래스 입장에서는 부모 클래스의 기능을 전혀 사용하지 않는다!!!!!
•
상속을 받는다는 것은 특정 부모클래스를 의존하고 있다는 것이다.
◦
부모 ← 자식 강결합 발생
◦
자식 클래스 입장에서는 부모 클래스의 기능을 전혀 사용하지 않는데, 부모 클래스를 알아야한다.
▪
이것은 좋은 설계가 아니다!
▪
잘못된 의존관계 때문에 부모 클래스를 수정하면, 자식 클래스에도 영향을 줄 수 있다.
•
추가로, 템플릿 메서드 패턴은 상속 구조를 사용하기 때문에 별도의 클래스나 익명 내부 클래스를 만들어야 하는 부분도 복잡하다.