[디자인 패턴] 템플릿 메소드 패턴

Stupefyee's avatar
Nov 13, 2024
[디자인 패턴] 템플릿 메소드 패턴

1. 개요

  • 템플릿 메소드 패턴은 알고리즘의 구조를 부모 클래스에서 정의하고, 알고리즘의 세부적인 단계는 자식 클래스에서 구현하는 패턴.
  • 알고리즘의 흐름을 정의하는 템플릿 메소드를 부모 클래스에서 제공하고, 변경될 수 있는 부분만 자식 클래스에서 구현.

2. 구성 요소

  1. AbstractClass (추상 클래스)
      • 템플릿 메소드를 정의하여 알고리즘의 전체적인 흐름을 관리.
      • 알고리즘의 일부 단계는 구현, 나머지 단계는 추상 메서드로 선언하여 자식 클래스에서 구현하도록 함.
  1. 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. 동작 과정

  1. Teacher 클래스: 알고리즘의 전체적인 흐름을 수업하기() 메서드에 정의.
      • 입장하기()출석부르기()퇴장하기()는 고정된 흐름으로 부모 클래스에서 처리.
      • 강의하기()는 추상 메서드로, 각 자식 클래스에서 구체적인 강의 내용을 정의.
  1. MathTeacher, ScienceTeacher 클래스:
      • 강의하기() 메서드를 각각 다른 방식으로 구현.
      • 템플릿 메서드 수업하기()는 부모 클래스에서 정의된 흐름을 그대로 따르면서자신의 강의 내용만 정의.

5. 출력 결과

코드 복사 수학 선생님의 수업: 입장하기 출석부르기 수학 강의하기 퇴장하기 과학 선생님의 수업: 입장하기 출석부르기 과학 강의하기 퇴장하기

6. 장점

  • 코드 중복 감소: 알고리즘의 공통된 부분은 부모 클래스에서 처리하고, 변경되는 부분만 자식 클래스에서 구현.
  • 알고리즘의 일관성 유지: 부모 클래스에서 정의된 흐름을 따르므로 알고리즘의 일관성을 보장.
  • 확장 용이: 새로운 동작을 추가할 때, 서브클래스에서만 변경하면 되므로 확장이 용이.

7. 단점

  • 상속 관계 강제: 알고리즘의 흐름을 부모 클래스에서 정의하므로, 자식 클래스는 부모 클래스의 상속을 강제로 받게 됨.
  • 유연성 부족: 템플릿 메소드가 부모 클래스에 고정되어 있기 때문에, 전체 알고리즘 흐름을 변경하려면 부모 클래스 수정이 필요.
Share article

stupefyee