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

Damsul·2023년 1월 13일
0

디자인패턴

목록 보기
5/15
post-thumbnail

공통된 기능을 상위 클래스에 정의하고, 자주 변경되며 확장되는 기능을 서브 클래스에 구현하여 효율적으로 재사용 가능하도록 한 행위 패턴

  1. 문제해결의 큰 흐름은 유지하고, 단계별 처리는 위임하고자 할때
  2. 구체적인 처리방법은 하위 클래스로 위임하고자 할때
    사용한다.

출처 : 위키디피아

  • AbstractClass : 알고리즘의 뼈대가 되는 공통 기능을 정의한 클래스
  • ConcreteClass : 구체적인 기능을 구현한 서브 클래스

예제

교수님이 강의하시는 코드를 구현한다고 가정해보자. Template Method Pattern을 이용하면 서브 클래스를 통해 교수님들의 다양한 강의를 들을 수 있다.

  • AbstractClass

[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("강의실로 들어갑니다.");
    }
}
  • ConcreteClass

[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

[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();
    }
}
  • 실행 결과

장단점

  • 장점

    • 중복코드를 줄일 수 있다.
    • 자식 클래스의 역할을 줄여 핵심 코드 관리가 용이하다.
    • 코드를 객체지향적으로 구성할 수 있다.
    • 기존 코드 수정없이 기능을 추가할 수 있다.
  • 단점

    • 추상 메소드가 많아지면서 클래스 관리가 복잡해질 수 있다.
    • 클래스간의 관계와 코드가 꼬일 수 있다.
    • 일부 클라이언트들은 알고리즘 구조에 의해 제한될 수 있다.
    • 단계들이 더 많을수록 유지가 더 어려운 경향이 있다.
profile
내 맘대로 작성하는 개발일지/ 작고 소중한 개발창고

0개의 댓글