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

이나겸's avatar
Nov 13, 2024
[디자인패턴] 템플릿메소드패턴
💡
여러 클래스에서 공통으로 사용하는 메서드를 템플릿(틀)화 하여 상위 클래스에서 정의하고, 하위 클래스마다 세부 동작 사항을 다르게 구현하는 패턴
💡

템플릿?

변하지 않는 것

특징

  • 변하지 않는 기능(템플릿)은 상위 클래스에서 만들어두고, 변경 및 확장할 기능은 하위 클래스에서 만들도록 함
    • 여러 단계 중 하나 이상의 단계가 추상 메소드로 정의되고 상위 클래스에서 구현됨
    • 상위의 메소드 실행 동작 순서 고정, 세부 실행 내용은 다양화
  • 추상화와 상속, 오버라이드, 동적 바인딩 활용
    • 알고리즘의 구조는 그대로 유지하면서 알고리즘의 특정 단계를 하위 클래스에서 재정의할 수 있음

예제

  • interface(TeacherAble)을 받아서 구현하는 추상 클래스(Teacher)
  • 추상 클래스(Teacher)를 상속받는 하위 클래스(구현 클래스)
    • JavaTeacher
    • PythonTeacher
    • HtmlTeacher
    • FlutterTeacher
  • App 클래스의 main에서 구현 클래스 호출하고 실행
package ch05.teacher; public interface TeacherAble { // interface니까 (interface는 new 불가능) // 메소드 생성할 때 public abstract는 생략해도됨 // interface의 추상은 자식들이 동일 메소드를 무조건 구현해야함 // 추상클래스의 추상은 자식들이 동일 메소드를 구현하도록 권유 void 수업하기(); } package ch05.teacher; // 추상 클래스(abstract) // 인터페이스 상속(implements TodaAble) public abstract class Teacher implements TeacherAble { protected void 입장하기() { System.out.println("입장하기"); } protected void 출석부르기() { System.out.println("출석부르기"); } // 이 클래스를 상속받는 클래스들에 오버라이드 실행될것 // 자식 클래스에서 활성화되고 부모 클래스에서 무효화됨 => 오버라이드, 동적바인딩 protected abstract void 강의하기(); protected void 퇴장하기() { System.out.println("퇴장하기"); } // interface(TodaAble)의 메소드(수업하기) 오버라이드 // 캡슐화 public void 수업하기() { 입장하기(); 출석부르기(); 강의하기(); 퇴장하기(); } } package ch05.teacher; // Teacher(추상클래스) 상속 // Teacher가 interface(TodaAble) 상속해놔서 // interface의 메소드도 추상클래스에 포함되어있음 public class JavaTeacher extends Teacher{ // Teacher 클래스의 추상메소드(강의하기) @Override protected void 강의하기() { System.out.println("자바 강의하기"); } } package ch05.teacher; // Teacher(추상클래스) 상속 // Teacher가 interface(TodaAble) 상속해놔서 // interface의 메소드도 추상클래스에 포함되어있음 public class PythonTeacher extends Teacher{ // Teacher 클래스의 추상메소드(강의하기) @Override protected void 강의하기() { System.out.println("파이썬 강의하기"); } } package ch05.teacher; // Teacher(추상클래스) 상속 // Teacher가 interface(TodaAble) 상속해놔서 // interface의 메소드도 추상클래스에 포함되어있음 public class HtmlTeacher extends Teacher{ // Teacher 클래스의 추상메소드(강의하기) @Override protected void 강의하기() { System.out.println("HTML 강의하기"); } } package ch05.teacher; // Teacher(추상클래스) 상속 // Teacher가 interface(TodaAble) 상속해놔서 // interface의 메소드도 추상클래스에 포함되어있음 public class FlutterTeacher extends Teacher{ // Teacher 클래스의 추상메소드(강의하기) @Override protected void 강의하기() { System.out.println("플러터 강의하기"); } } package ch05; import ch05.teacher.FlutterTeacher; import ch05.teacher.HtmlTeacher; import ch05.teacher.JavaTeacher; import ch05.teacher.PythonTeacher; public class App { public static void main(String[] args) { JavaTeacher t1 = new JavaTeacher(); // JavaTeacher에서 캡슐화시킨것을 불러옴 // 순서를 틀릴일도, 호출할 메소드를 헷갈릴 일도 없음 t1.수업하기(); PythonTeacher t2 = new PythonTeacher(); // PythonTeacher에서 캡슐화시킨것을 불러옴 t2.수업하기(); HtmlTeacher t3 = new HtmlTeacher(); // HtmlTeacher에서 캡슐화시킨것을 불러옴 t3.수업하기(); FlutterTeacher t4 = new FlutterTeacher(); // FlutterTeacher에서 캡슐화시킨것을 불러옴 t4.수업하기(); } }
Share article

Nakyeom's Study