Template Method Pattern (템플릿 메소드 패턴)

YeongUng Kim·2021년 5월 1일
1

디자인패턴

목록 보기
2/4
post-thumbnail

개요

객체의 연산에는 해당 공통기능,알고리즘의 뼈대만 정의하고 서브클래스에서 해당 기능,알고리즘을 구현하여 사용하는 디자인패턴. 구체적인 내용은 서브클래스에서 재정의 한다. 특정 상황 또는 환경에 맞게 알고리즘을 재정의 하고자할때 유용하다.


본론

Class Diagram

  • Abstract Class : 서브 클래스들이 처리해야할 알고리즘 전의 기본연산을 정의하고 제공한다. 또한 서브클래스 알고리즘의 뼈대를 제공하는 템플릿 메소드를 제공한다. 템플릿 메소드는 AbstractClass의 공통연산,기본연산을 제공하고 서브클래스의 연산도 제공한다.

  • ConcreteClass : 재정의가 필요한 알고리즘 연산을 수행하기 위한 구체 클래스

설명

공통으로 쓰이는 알고리즘은 AbstractClass의 commonAlgorithm에서 정의하고 쓰임이 달라지는 알고리즘은 ConcreteClass에서 재정의하여 코드의 중복을 줄이고 재사용성을 높인다. 한마디 키워드로 정의하자면 공통 부분 분리.

사용예

  • 공통적인 알고리즘은 그대로 쓰고 행위가 달라질 수 있는 알고리즘은 서브 클래스에서 정의할 수 있도록 할때

  • 서브클래스에서 공통적인 부분들을 추출하여 상위 클래스에 정의함으로써 코드중복을 피하고 싶을때. 즉, 상위클래스에서 공통적인 기능을 정의해두고 재정의가 필요한 연산들은 템플릿 메소드를 통해 서브클래스로 위임하여 처리한다.

  • 서브클래스의 확장을 제어할 수 있다. 템플릿 메소드가 특점 시점에 hook 연산을 호출하도록 정의하여 특정 시점에서만 확장이 가능하다(hook : 서브클래스에서 확장할 수 있는 기본 행동을 제공하는 연산. 기본적으로 아무내용도 정의하지 않는다.)


예제

Person(Abstract Class)

public abstract class Person {
    final void action(){
        common();
        doCoding();
    }
    // 공통연산
    private void common(){
        System.out.print("HI I'm the Developer who ");
    }
    // 재정의 연산 - 서브클래스에 위임
    abstract void doCoding();
}

JavaDeveloper(ConcreteClass)

public class JavaDeveloper extends Person {
    @Override
    void doCoding() {
        System.out.println("coding java lang");
    }
}

CDeveloper(ConcreteClass)

public class CDeveloper extends Person {
    @Override
    void doCoding() {
        System.out.println("coding C lang");
    }
}

Clinet

public class Client {
    public static void main(String[] args){
        JavaDeveloper javaDeveloper = new JavaDeveloper();
        javaDeveloper.action();
        CDeveloper cDeveloper = new CDeveloper();
        cDeveloper.action();
    }
}

실행결과

HI I'm the Developer who coding java lang
HI I'm the Developer who coding C lang


AbstractClass Person은 공통 행위인 common 메소드를 정의했다. doCoding 메소드는 abstract 키워드를 사용하여 서브클래스로 행위를 위임하여 각 서브클래스에서 처리하도록 했다.


출처: GoF의 디자인패턴

profile
기록하지 않으면 까먹어서 만든 블로그..

0개의 댓글