Template Method Pattern
알고리즘 구조는 상위 클래스, 세부 구현은 하위 클래스에 정의하는 패턴
- 리팩터링(Refactoring): 기존 코드 구조를 개선하는 과정
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();
t1.수업하기();
PythonTeacher t2 = new PythonTeacher();
t2.수업하기();
HTMLTeacher t3 = new HTMLTeacher();
t3.수업하기();
FlutterTeacher t4 = new FlutterTeacher();
t4.수업하기();
}
}
package ch05.teacher;
// abstract 추상 클래스 - 부모가 정의할 수 없는 걸 자식이 무조건 구현
// implements 구현 - 쿨래스 구현 시, 정의한 모든 메서드 오버라이드함 / 자식만 동작?
// TeacherAble을 구현하는 추상 클래스 Teacher
// 모든 Teacher가 동일하게 수행하는 행동 지정하는 클래스
public abstract class Teacher implements TeacherAble {
// protected 생성자
// 1. 템플릿 메서드를 정의하는 부모 클래스 객체 생성 방지
// 2. 자식 클래스가 부모 메서드를 받아 사용(상속관계)
protected void 입장하기() {System.out.println("입장하기");}
protected void 출석부르기() {System.out.println("출석부르기");}
// 부모 클래스 선언, 자식 클래스 구현 하도록 강제 설정
// Teacher마다 행동을 다르게 적용 가능
protected abstract void 강의하기();
protected void 퇴장하기() {System.out.println("퇴장하기");}
// 템플릿 메서드 패턴 : extends Teacher을 자식 클래스 적용
// 외부에서 큰 흐름만 알고 세부 사항은 캡슐화되어 보이지 않는다
// 템플릿 메서드 패턴의 캡슐화 원칙 - 공통된 행동 순서
public void 수업하기() {
입장하기();
출석부르기();
강의하기();
퇴장하기();
}
}
package ch05.teacher;
// interface - 특정 기능만 노출시키고 나머지 숨기기
// 수업하기() 기능만 외부에 노출 시킴
public interface TeacherAble {
public abstract void 수업하기(); // public 자동 생략 가능
}
package ch05.teacher;
public class PythonTeacher extends Teacher {
protected void 강의하기() {
System.out.println("파이썬 강의하기");
}
}
package ch05.teacher;
// 요구사항 > 동작하기(인스턴스) /App.java에서 작동
public class JavaTeacher extends Teacher{
protected void 강의하기() {
System.out.println("자바 강의하기");
}
}
package ch05.teacher;
public class HTMLTeacher extends Teacher{
protected void 강의하기() {
System.out.println("HTML 강의하기");
}
}
package ch05.teacher;
public class FlutterTeacher extends Teacher{
protected void 강의하기() {
System.out.println("플러터 강의하기");
}
}
Share article