Search
〰️

Template Method Pattern

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
복사

단점

자식 클래스가 부모 클래스와 컴파일 시점에 강하게 결합된다.
의존관계에 대한 문제 발생
→ 자식 클래스 입장에서는 부모 클래스의 기능을 전혀 사용하지 않는다!!!!!
상속을 받는다는 것은 특정 부모클래스를 의존하고 있다는 것이다.
부모 ← 자식 강결합 발생
자식 클래스 입장에서는 부모 클래스의 기능을 전혀 사용하지 않는데, 부모 클래스를 알아야한다.
이것은 좋은 설계가 아니다!
잘못된 의존관계 때문에 부모 클래스를 수정하면, 자식 클래스에도 영향을 줄 수 있다.
추가로, 템플릿 메서드 패턴은 상속 구조를 사용하기 때문에 별도의 클래스나 익명 내부 클래스를 만들어야 하는 부분도 복잡하다.