[Design Pattern] Template Method Pattern
오늘은 간단하게 Template Method Pattern 에 대해 정리해두려 한다.
템플릿 메서드 패턴은 Spring Framework 같은 프레임워크 환경에서 자주 활용되는 패턴이고, 실무코드에서도 중복인 코드를 줄이기 위해 자주 사용되는 패턴이니 잘 정리해두면 좋다.
Template Method Pattern이란 ?
템플린 메서드 패턴은 알고리즘의 구조를 상위클래스의 메서드에 정의하고 하위클래스에서 자신에 맞게 세부 알고리즘을 정의하도록하는 패턴이다.
구현하려하는 알고리즘에 일정한 단계가 있을 것이고 , 세부적인 단계들 중에 조금씩 구현내용이 다른 경우 사용하면 된다.
작성 방법은 다음과 같다.
알고리즘의 여러단계를 각 메서드로 선언하고, 그 알고리즘을 수행할 템플릿 메서드를 만들어준다. 하위 클래서에서는 나눠진 메서드 (세부적인 단계)를 구현해 준다.
예시
위의 클래스 다이어그램 예시를 보면 이해가 잘 될 것이라 생각한다. 예시는 책 클린코드를 참고하여 가져왔다.
클래스는 나라별 휴가 정책을 정하는 클래스인데, 다른것은 다 똑같다 하더라도 휴가 법정 최소 일수는 나라마다 다를 것이다. 그렇기에 법정 최소 일수를 구하는 세부 알고리즘만 따로 빼서 구현한다.
코드를 통해 조금더 살펴보자.
abstract public class VacationPolicy {
public void accrueVacation() {
calculateBaseVactionHours();
alterForLegalMinimums();
applyToPayroll();
}
// 지금까지 근무한 시간을 바탕으로 휴가 일수를 계산하는 메서드
private void calculateBaseVacationHours() { /* ...*/ };
// 휴가 일수가 최소 법정일수를 만족하는지 확인하는 메서드
abstract protected void alterForLegalMinmums() { /* ...*/ };
// 휴가 일수를 급여 대장에 적용하는 메서드
private void aplyToPayroll() { /* ...*/ };
}
위의 코드를 보면 공통된 알고리즘을 accrueVacation 이라는 템플릿 메서드에 담고,
세부적인 내용 중 동일한 내용에 대해서는 메서드로 구현을 해주고, 다른 내용이 있는 것은 하위클래스가 구현하도록 abstract 메서드로 만들어 줬다.
실제 구현을 해보면 아래와 같이 구현이 될 것이다.
public class USVacationPolicy extends VacationPolicy {
@Override
protected void alterForLegalMinimums() {
// US 의 법정 최수 일수 계산 로직
}
}
public class EUVacationPolicy extends VacationPolicy {
@Override
protected void alterForLegalMinimums() {
// EU 의 법정 최수 일수 계산 로직
}
}
하위클래스에서는 각각의 알고리즘을 이렇게 구현해주면 된다.
소스코드를 보면서 공부하면 이해가 어렵지 않을 것이니, 잘 숙지해서 템플릿 메서드 패턴을 잘 활용해보길 바란다.
Ref.
로버트 C.마틴, 『클린코드』, 도서출판인사이트(2021), p219~220