변하는 것과 변하지 않는 것을 분리
템플릿 메소드 패턴 (Template Method Pattern)은 변하는 것과 변하지 않는 것을 분리해서 모듈화하는 디자인 패턴
템플릿 메소드 패턴은 이름 그대로 템플릿을 사용하는 방식
템플릿은 기준이 되는 거대한 틀
템플릿이라는 틀에 변하지 않는 부분을 둠
일부 변하는 부분을 별도로 호출해서 해결
✅ 1. 코드의 중복을 줄이고 재사용성을 높이기 위해
✅ 2. 알고리즘의 흐름(순서)을 통제할 수 있어서
✅ 3. OCP(Open-Closed Principle, 개방-폐쇄 원칙) 준수
✅ 4. 유지보수와 협업에 유리
// 상위 클래스: 템플릿 정의
public abstract class DataProcessor {
// 템플릿 메소드: 변경되지 않는 알고리즘의 뼈대
public final void process() {
readData();
processData();
writeData();
}
// 하위 클래스에서 구현할 메소드들 (변하는 부분)
protected abstract void readData();
protected abstract void processData();
// 변하지 않는 공통 동작
protected void writeData() {
System.out.println("결과 데이터를 파일에 저장했습니다.");
}
}
// CSV 파일 처리
public class CsvDataProcessor extends DataProcessor {
@Override
protected void readData() {
System.out.println("CSV 데이터를 읽습니다.");
}
@Override
protected void processData() {
System.out.println("CSV 데이터를 처리합니다.");
}
}
// JSON 파일 처리
public class JsonDataProcessor extends DataProcessor {
@Override
protected void readData() {
System.out.println("JSON 데이터를 읽습니다.");
}
@Override
protected void processData() {
System.out.println("JSON 데이터를 처리합니다.");
}
}
// 실행 예
public class Main {
public static void main(String[] args) {
DataProcessor csvProcessor = new CsvDataProcessor();
csvProcessor.process();
DataProcessor jsonProcessor = new JsonDataProcessor();
jsonProcessor.process();
}
}
💡실행 결과
CSV 데이터를 읽습니다.
CSV 데이터를 처리합니다.
결과 데이터를 파일에 저장했습니다.
JSON 데이터를 읽습니다.
JSON 데이터를 처리합니다.
결과 데이터를 파일에 저장했습니다.
공통된 처리 순서(process)는 변하지 않고, 내용(read/process)은 상황에 따라 유연하게 바뀌는 구조
그러나, 템플릿 메소드 패턴은 새로운 동작을 정의할 때마다 하위 클래스를 계속 만들어야 한다는 단점 존재
-> 익명 내부 클래스를 사용하면 단점 보완 가능
왜 익명 내부 클래스가 도움이 되는가?
public class Main {
public static void main(String[] args) {
DataProcessor csvProcessor = new DataProcessor() {
@Override
protected void readData() {
System.out.println("CSV 읽기");
}
@Override
protected void processData() {
System.out.println("CSV 처리");
}
};
csvProcessor.process();
}
}
이 방식은 하위 클래스를 별도로 파일로 만들 필요 없이,
필요할 때 즉석에서 필요한 동작만 구현해 쓸 수 있음
즉, 템플릿 메소드 패턴은 '클래스를 나눌지, 익명 클래스로 처리할지'를 상황에 따라 유연하게 선택할 수 있는 구조
"변하지 않는 것은 부모 클래스에, 변하는 것은 자식 클래스에."
템플릿 메소드 패턴은 변화와 고정의 분리를 통해 유지보수, 확장성, 코드의 일관성을 제공하는 강력한 도구