알고리즘의 뼈대(단계의 순서)는 상위 클래스의 메서드에 고정하고, 일부 단계만 하위 클래스가 바꾸게 하는 패턴.
abstract class DataImporter {
run() { // 뼈대는 고정
const raw = this.read()
const rows = this.parse(raw)
this.validate(rows)
this.save(rows)
}
protected abstract read(): string
protected abstract parse(raw: string): Row[]
protected validate(rows: Row[]) { /* 기본 구현, 필요하면 덮어씀(훅) */ }
private save(rows: Row[]) { db.insert(rows) }
}
class CsvImporter extends DataImporter { ... }- 흐름은 같은데 세부 단계만 다른 클래스들의 중복을 없앤다. 『리팩터링』 1판의 템플릿 메서드 만들기(Form Template Method)가 이 구조로 가는 길이다(2판 카탈로그에서는 빠졌고 Refactoring.Guru에 남아 있다)
- 기본 구현이 있는 단계(훅, Hook)는 필요한 하위 클래스만 덮어쓴다
- 프레임워크가 흐름을 쥐고 내 코드를 부르는 "할리우드 원칙(Hollywood Principle, 우리가 연락할게)"의 대표 예다. 테스트 프레임워크의 setUp·tearDown이 그렇다
대가
상속 결합이 생긴다. 하위 클래스는 부모의 흐름에 묶이고, 부모를 고치면 자식이 깨지기 쉽다(상속보다 위임). 조합이 더 유연해야 하면 단계를 함수로 받는 전략 패턴이나 콜백을 비교한다. JavaScript에서는 상속 대신 단계 함수를 인자로 받는 고차 함수로 같은 효과를 내는 경우가 많다. 행동 패턴 전체는 행동 패턴.
출처: Template Method — Refactoring.Guru · Form Template Method — Refactoring.Guru