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

단점

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