Design Pattern

디자인패턴 5) Template Method Pattern

anyjava 2014. 4. 28. 16:06

Template Method Pattern

1. 개요

base class(추상클래스)에서 메소드 실행 순서를 Template Method 에서 정의하며, 실제 동작하는 알고리즘은 구현클래스에서 정의하도록 클래스를 설계하는 것.

2. 클래스 다이어그램

Template Method  Partern

  • AbstractClass
    tempateMethod 를 가지고 있는 기본 클래스. 프로그램의 큰맥락의 알고리즘이 정의 되어 있으며 구체적인 실행은 하위 클래스에 맡긴다.

  • ConcreteClass
    Abstract Class 를 구현하는 클래스, 추상메소드들을 구현하며 프로그램 흐름과 고려하지 않아도 되면 각 메소드내의 알고리즘만 구현해주면 된다.

3. Java로 구현한 패턴

3.1 클래스 다이어 그램




3.2 소스

[CommonBatchTemplate.java]

package TemplateMethod;

abstract public class CommonBatchTemplate {

    /**
     *  공통적인 비지니스 로직이 포함되는 Template Method.
     */
    public void executeBathcJob() {
        this.setConfig();

        this.connectDb();

        this.printInfo();
        this.runTask();
        this.printResult();

        this.closeDb();
    }


    /**
     *  서브클래스에서 구현해야할 추상메소드
     */
    abstract protected void printInfo();
    abstract protected void runTask();
    abstract protected void printResult();


    /**
     * 환경설정 파일 로드. DB정보, logfile정보 등
     */
    private void setConfig() {
        System.out.println(" called setConfig() ");
    }

    /**
     * Jdbc Connect 작업
     */
    private void connectDb() {
        System.out.println(" called connectDb() ");
    }

    /**
     * Jdbc close
     */
    private void closeDb() {
        System.out.println(" called closeDb() ");
    }

}

[SimpleBatch.java]

package TemplateMethod;

public class SimpleBatch extends CommonBatchTemplate {

    @Override
    protected void printInfo() {
        // TODO Auto-generated method stub
        System.out.println("=== Simple Batch Start! ===");

    }

    @Override
    protected void runTask() {
        // TODO Auto-generated method stub
        /**
         * 실제 작업에 해당하는 내용을 구현
         */
        for( int i=0; i<10; ++i )
            System.out.println( i );

    }

    @Override
    protected void printResult() {
        // TODO Auto-generated method stub
        System.out.println("=== Simple Batch End! ===");

    }


    public static void main(String[] args) {
        // 추상클래스의 Template Method 를 호출해준다.
        new SimpleBatch().executeBathcJob();
    }

}

4. 활용범위

  • 다양하게 변할수 있는 부분을 subclass로 내리고 공통적인 부분을 추상클래스에 정의한다.
  • 코드를 리펙토링 할때 공통적인 알고리즘을 Template Method 및 추상클래스로 모아서 코드의 중복을 줄인다.

5. 마치며

Template Method 패턴을 이용하면 공통적으로 사용되는 코드를 상당부분 줄일 수 있다. 공통라이브러리를 만드는 팀에 있다면 꼭 고려해보도록 하자!

반응형