공통된 기능을 상위 클래스에 정의하고, 자주 변경되며 확장되는 기능을 서브 클래스에 구현하여 효율적으로 재사용 가능하도록 한 행위 패턴
- AbstractClass : 알고리즘의 뼈대가 되는 공통 기능을 정의한 클래스
- ConcreteClass : 구체적인 기능을 구현한 서브 클래스
교수님이 강의하시는 코드를 구현한다고 가정해보자. Template Method Pattern을 이용하면 서브 클래스를 통해 교수님들의 다양한 강의를 들을 수 있다.
[Professor.java]
public abstract class Professor {
public void startLecture() {
goIn();
comeInProfessor();
attendance();
teach();
goOutProfessor();
goOut();
}
private void goOut() {
System.out.println("강의실에서 나옵니다.");
}
private void goOutProfessor() {
System.out.println("교수님이 강의를 마치시고 강의실을 나갑니다.");
}
public abstract void teach();
private void attendance() {
System.out.println("교수님이 출석체크를 하십니다.");
}
private void comeInProfessor() {
System.out.println("교수님이 강의실로 들어옵니다.");
}
private void goIn() {
System.out.println("강의실로 들어갑니다.");
}
}
[JavaProfessor.java]
public class JavaProfessor extends Professor {
@Override
public void teach() {
System.out.println("교수님의 자바 강의가 시작됩니다.");
}
}
[PythonProfessor.java]
public class PythonProfessor extends Professor {
@Override
public void teach() {
System.out.println("교수님의 파이썬 강의가 시작됩니다.");
}
}
[OsProfessor.java]
public class OsProfessor extends Professor {
@Override
public void teach() {
System.out.println("교수님의 운영체제 강의가 시작됩니다.");
}
}
[Client.java]
public class Client {
public static void main(String[] args) {
Professor javaProfessor = new JavaProfessor();
javaProfessor.startLecture();
System.out.println("---------------------");
Professor pythonProfessor = new PythonProfessor();
pythonProfessor.startLecture();
System.out.println("---------------------");
Professor osProfessor = new OsProfessor();
osProfessor.startLecture();
}
}
장점
단점