1. 개요
- 템플릿 메소드 패턴은 알고리즘의 구조를 부모 클래스에서 정의하고, 알고리즘의 세부적인 단계는 자식 클래스에서 구현하는 패턴.
- 알고리즘의 흐름을 정의하는 템플릿 메소드를 부모 클래스에서 제공하고, 변경될 수 있는 부분만 자식 클래스에서 구현.
2. 구성 요소
- AbstractClass (추상 클래스)
- 템플릿 메소드를 정의하여 알고리즘의 전체적인 흐름을 관리.
- 알고리즘의 일부 단계는 구현, 나머지 단계는 추상 메서드로 선언하여 자식 클래스에서 구현하도록 함.
- ConcreteClass (구체 클래스)
- 부모 클래스에서 정의된 템플릿 메서드를 따르면서 알고리즘의 구체적인 단계만 구현.
- 템플릿 메소드에서 호출되는 추상 메서드를 구체적으로 정의하여 동작을 완성.
3. 예시 코드
3.1 Teacher 클래스 (AbstractClass)
public abstract class Teacher implements TodoAble {
// 공통된 단계: 입장, 출석, 퇴장
protected void 입장하기() {
System.out.println("입장하기");
}
protected void 출석부르기() {
System.out.println("출석부르기");
}
// 변경되는 부분: 강의 내용
protected abstract void 강의하기();
protected void 퇴장하기() {
System.out.println("퇴장하기");
}
// 템플릿 메소드: 수업 흐름 정의
@Override
public void 수업하기() {
입장하기();
출석부르기();
강의하기(); // 자식 클래스에서 구현
퇴장하기();
}
}
3.2 MathTeacher, ScienceTeacher 클래스 (ConcreteClass)
public class MathTeacher extends Teacher {
@Override
protected void 강의하기() {
System.out.println("수학 강의하기");
}
}
public class ScienceTeacher extends Teacher {
@Override
protected void 강의하기() {
System.out.println("과학 강의하기");
}
}
3.3 App 클래스에서 템플릿 메소드 사용
public class App {
public static void main(String[] args) {
Teacher mathTeacher = new MathTeacher();
Teacher scienceTeacher = new ScienceTeacher();
System.out.println("수학 선생님의 수업:");
mathTeacher.수업하기(); // 템플릿 메소드 호출
System.out.println("\n과학 선생님의 수업:");
scienceTeacher.수업하기(); // 템플릿 메소드 호출
}
}
4. 동작 과정
- Teacher 클래스: 알고리즘의 전체적인 흐름을
수업하기()
메서드에 정의. 입장하기()
,출석부르기()
,퇴장하기()
는 고정된 흐름으로 부모 클래스에서 처리.강의하기()
는 추상 메서드로, 각 자식 클래스에서 구체적인 강의 내용을 정의.
- MathTeacher, ScienceTeacher 클래스:
강의하기()
메서드를 각각 다른 방식으로 구현.- 템플릿 메서드
수업하기()
는 부모 클래스에서 정의된 흐름을 그대로 따르면서, 자신의 강의 내용만 정의.
5. 출력 결과
코드 복사
수학 선생님의 수업:
입장하기
출석부르기
수학 강의하기
퇴장하기
과학 선생님의 수업:
입장하기
출석부르기
과학 강의하기
퇴장하기
6. 장점
- 코드 중복 감소: 알고리즘의 공통된 부분은 부모 클래스에서 처리하고, 변경되는 부분만 자식 클래스에서 구현.
- 알고리즘의 일관성 유지: 부모 클래스에서 정의된 흐름을 따르므로 알고리즘의 일관성을 보장.
- 확장 용이: 새로운 동작을 추가할 때, 서브클래스에서만 변경하면 되므로 확장이 용이.
7. 단점
- 상속 관계 강제: 알고리즘의 흐름을 부모 클래스에서 정의하므로, 자식 클래스는 부모 클래스의 상속을 강제로 받게 됨.
- 유연성 부족: 템플릿 메소드가 부모 클래스에 고정되어 있기 때문에, 전체 알고리즘 흐름을 변경하려면 부모 클래스 수정이 필요.
Share article