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