템플릿 패턴

김인범's avatar
Nov 13, 2024
템플릿 패턴
상위 클래스에서 알고리즘의 기본 구조를 정의하고, 하위 클래스에서 일부 단계를 구체적으로 구현하는 패턴
 
세부 단계에서 유연하게 동작을 변경할 수 있어 코드의 재사용성과 유연성이 높아집니다. 부모 클래스에서 알고리즘의 골격을 정의, 부모 클래스에서 해당 알고리즘의 구조를 변경 X 자식 클래스들이 알고리즘의 특정 단계들을 오버라이드(재정의) 할 수 있도록 하는 행동 디자인 패턴이다.
 

장점과 단점

장점

  1. 코드 재사용성
  1. 유연성
  1. 변경 용이성

단점

  1. 상속의 제한 (다중 상속 불가능)
  1. 알고리즘이 복잡해질 가능성 (알고리즘 구조가 복잡할수록 하위 클래스 구현이 어려워질수 있음)
 

코드 예시

  1. 수업 진행의 틀을 제공하는 인터페이스
public interface TeacherAble { void 수업하기(); }
 
  1. 선생님들의 수업 진행 과정 틀을 제공하는 상위 클래스
public abstract class Teacher implements TeacherAble { protected void 입장하기(){ System.out.println("입장하기"); } protected void 출석부르기(){ System.out.println("출석부르기"); } protected abstract void 강의하기(); protected void 퇴장하기(){ System.out.println("퇴장하기"); } @Override public void 수업하기() { 입장하기(); 출석부르기(); 강의하기(); 퇴장하기(); } }
  • 입장하기, 출석부르기, 퇴장하기는 모든 선생님들의 수업하기 속 공통 동작이기 때문에 해당 상위 클래스에서 정의내리고 있습니다. 강의하기 메서드는 각 선생님들이 가르치실 과목이 다르기 때문에 각각의 선생님 클래스에서 역할을 구체적으로 구현합니다.
 
  1. 과목 별 선생님들의 클래스
//Flutter 과목 선생님 클래스 public class FlutterTeacher extends Teacher{ @Override protected void 강의하기() { System.out.println("플러터 강의하기"); } } ----------------------------------------------- //HTML 과목 선생님 클래스 public class HTMLTeacher extends Teacher { @Override protected void 강의하기(){ System.out.println("HTML 수업하기"); } } ----------------------------------------------- //JAVA 과목 선생님 클래스 public class JavaTeacher extends Teacher{ @Override protected void 강의하기() { System.out.println("자바 강의하기"); } } ----------------------------------------------- //Python 과목 선생님 클래스 public class PythonTeacher extends Teacher { @Override protected void 강의하기() { System.out.println("파이썬 강의하기"); } }
  • 상위 클래스에서 정의되지 않은 “강의하기 메서드”를 각각의 선생님 하위 클래스에서 구체적으로 정의하는 코드들 입니다.
 
  1. main 클래스
public class App { public static void main(String[] args) { JavaTeacher t1 = new JavaTeacher(); t1.수업하기(); System.out.println(); PythonTeacher t2 = new PythonTeacher(); t2.수업하기(); System.out.println(); HTMLTeacher t3 = new HTMLTeacher(); t3.수업하기(); FlutterTeacher t4 = new FlutterTeacher(); t4.수업하기(); /* t1.입장하기(); t1.출석부르기(); t1.자바강의하기(); t1.퇴장하기(); */ } }
  1. 결과
((자바 선생님)) 입장하기 출석부르기 자바 강의하기 퇴장하기 ------------ ((파이썬 선생님)) 입장하기 출석부르기 파이썬 강의하기 퇴장하기 ------------ ((HTML 선생님)) 입장하기 출석부르기 HTML 수업하기 퇴장하기 ------------ ((플러터 선생님)) 입장하기 출석부르기 플러터 강의하기 퇴장하기 ------------
 

참고 문헌

Share article

taker