목차
Template Method Pattern(템플릿 메서드 패턴)
템플릿 메서드는 처리 순서는 공통인데 일부 단계만 달라질 때 사용한다. 상위 클래스가 순서를 고정하고 하위 클래스가 변하는 단계를 구현한다. 예를 들어 데이터를 읽고, 검증하고, 저장하는 순서는 같지만 파일 형식에 따라 읽기 단계가 다를 수 있다.

그림의 AbstractDisplay가 전체 출력 순서를 정의하고, CharDisplay와 StringDisplay가 각 단계의 내용을 채운다. 원본 예제의 open → print 5회 → close 흐름을 Java로 표현하면 다음과 같다.
abstract class AbstractDisplay {
protected abstract void open();
protected abstract void print();
protected abstract void close();
public final void display() {
open();
for (int i = 0; i < 5; i++) {
print();
}
close();
}
}
final class CharDisplay extends AbstractDisplay {
private final char value;
CharDisplay(char value) { this.value = value; }
protected void open() { System.out.print("<<"); }
protected void print() { System.out.print(value); }
protected void close() { System.out.println(">>"); }
}
new CharDisplay('A').display()는 <<AAAAA>>를 출력한다. display()를 final로 둔 이유는 하위 클래스가 반복 횟수나 단계 순서를 바꾸지 못하게 하기 위해서다. protected 단계 메서드는 하위 클래스만 구현하면 된다. 공통 순서가 업무 규칙이라면 display()를 직접 호출하는 쪽은 구현 클래스를 바꿔도 같은 순서가 보장된다.
문자열 구현은 줄의 너비를 계산할 때 주의해야 한다. 기존 예제의 str.getBytes().length는 기본 문자 인코딩에서의 바이트 수이므로, 화면에 보이는 글자 폭과 다를 수 있다. 콘솔 장식 선의 길이를 맞추려면 대상 출력 환경의 문자 폭 기준을 정해야 한다. ASCII만 다룬다는 제약이 있다면 문자열 길이를 사용할 수 있지만, 한글·이모지까지 정확히 맞추려면 별도 폭 계산이 필요하다.

선택 기준과 실패 사례
두 구현이 단지 한두 값만 다르면 상속 계층보다 함수 매개변수나 전략 객체가 단순하다. 하위 클래스가 대부분의 단계를 비워 두거나 상위 클래스 상태를 복잡하게 알아야 한다면 추상화 경계가 맞지 않을 수 있다. 또 open()에서 자원을 얻는 작업이 실패하거나 print()가 예외를 내면 close()가 실행되지 않는다. 실제 파일·네트워크 자원을 다루는 템플릿이라면 try/finally 또는 try-with-resources로 정리 단계를 보장해야 한다. 이 패턴의 장점은 코드 줄 수 감소보다 공통 알고리즘의 순서와 불변 조건을 한곳에 두는 것이다.