[디자인 패턴] 템플릿 메서드 패턴(Template Method Pattern)

Aug 18, 2024
[디자인 패턴] 템플릿 메서드 패턴(Template Method Pattern)
 

1. 템플릿 메서드 패턴이란?

 

1-1. 정의

 
객체지향 프로그래밍에서 사용되는 디자인 패턴 중 하나이다. 이 패턴은 알고리즘의 구조를 정의하고, 그 알고리즘의 일부 단계를 서브클래스에서 구현하도록 하는 데 사용된다. 쉽게 말해, 알고리즘의 골격을 템플릿 메서드가 정의하고, 구체적인 구현은 서브클래스에 맡기는 방식.
 

1-2. 폭포수 모델

 
폭포수 모델은 위에서 만들어 놓은 형태 그대로 개발을 하는 것.
설계를 단계별로 쪼갠다.(10단계 → 5단계)
1단계의 핵심 로직만 빼
2단계의 핵심 로직 ..
이걸로 프로토타입을 만듬, 일주일동안 프로토타입을 개발
이 모델의 장점 : 핵심 기능만 넣었기 때문에 피드백을 빨리 받을 수 있음
 

1-3. 캡슐화

 
아래는 템플릿 메서드 패턴 아니고 캡슐화^^
JavaTeacher 클래스의 ‘입장하기’, ‘출석부르기’, ‘자바강의하기’, ‘퇴장하기’ 를 ‘수업하기()’ 라는 하나의 메서드 안에 넣어 통으로 만든다.
구체적인 것을 추상적인 것으로 때리는 것(?)이다.
 
package ex05.teacher; public class JavaTeacher { public void 수업하기() { 입장하기(); 출석부르기(); 자바강의하기(); 퇴장하기(); } public void 입장하기() { System.out.println("입장하기"); } public void 출석부르기() { System.out.println("출석부르기"); } public void 자바강의하기() { System.out.println("자바강의하기"); } public void 퇴장하기() { System.out.println("퇴장하기"); } }
package ex05; import ex05.teacher.JavaTeacher; public class App { public static void main(String[] args) { JavaTeacher jt = new JavaTeacher(); jt.수업하기(); } }
 
하지만, 선생님이 감당할 수 없을 만큼 늘어난다면..?
 
강의하는 과목만 다를 뿐, ‘입장하기’, ‘출석부르기’, ‘퇴장하기’ 는 반복되는 것을 알 수 있다.
이 때, 템플릿 메서드 패턴을 사용해보자.
 
notion image
 

2. 적용

 
템플릿 메서드 패턴은 자식들이 공통적으로 쓰고 있는 것을 끌어올리는 것이다.
세 teacher 에서 뭐가 공통적인지 본다.
 
notion image
 
부모를 만들고 계속해서 자식을 만드는 게 맞지만, 일반적으로는 구체적인 것을 만들고 공통적으로 끌어올린다.
위의 예시에서 강의하기를 제외하고는 전부 공통적인 것을 알 수 있다.
추상클래스는 추상메서드와 바디{ } 가 있는 일반메서드도 만들 수 있으니,
Teacher 라는 추상클래스를 부모로 만들어놓고, 다른 내용의 강의하기() 만 오버라이드해서 사용한다.
 
package ex05.teacher; // 템플릿 public abstract class Teacher { public void 수업하기() { 입장하기(); 출석부르기(); 강의하기(); 퇴장하기(); } public void 입장하기() { System.out.println("입장하기"); } public void 출석부르기() { System.out.println("출석부르기"); } public abstract void 강의하기(); public void 퇴장하기() { System.out.println("퇴장하기"); } }
package ex05.teacher; public class JavaTeacher extends Teacher{ @Override public void 강의하기() { System.out.println("자바 강의하기"); } }
package ex05.teacher; public class PythonTeacher extends Teacher{ @Override public void 강의하기() { System.out.println("Python 강의하기"); } }
package ex05; import ex05.teacher.HtmlTeacher; import ex05.teacher.JavaTeacher; import ex05.teacher.PythonTeacher; /** * 템플릿 : 반복적인 작업을 간편하게 하기 위해 미리 정의된 틀이나 형식 */ public class App { public static void main(String[] args) { JavaTeacher jt = new JavaTeacher(); jt.수업하기(); PythonTeacher pt = new PythonTeacher(); pt.수업하기(); HtmlTeacher ht = new HtmlTeacher(); ht.수업하기(); } }
 
Teacher 는 도장 같은 것이다. 찍어내는 것.
모두가 같은데 딱 강의하기만 다르기 때문에 템플릿 메서드 패턴을 사용한 것.
 
notion image
 
Share article

eunmouse