Design Patterns

[Design Patterns] Template Method

우라릭 2024. 6. 16. 21:58
void openDocument(name) {
   if (!canOpenDocument(name)) {
       return;
   }
   
   Document doc = createDocument(name);
   if (doc) {
       addDocuments(doc);
       doc.read();
   }
}​

 

 

목차

    개요

    내용

    요약

    알고리즘의 기본 뼈대를 정의하고 각 스텝을 하위 클래스가 작성하도록 하자. 

    예시

    문서를 읽는 애플리케이션을 생각해봅시다. 여기서 문서는 로컬에서 가져오는 PDF, spreadsheet 혹은 REST API로 받아오는 JSON 등 여러가지가 될 수 있습니다. 이러한 문서를 열어서 일관된 포맷으로 파싱해주는 알고리즘을 어떻게 만들어야 할까요? 이와 관련된 알고리즘에 대해 아래와 같이 뼈대를 만들어둘 수 있을 겁니다.

    List<Token> parse(String name) {
        if (!canOpenDocument(name))
            throw Exception;
        
        Document doc = createDocument(name);
        if (doc) {
            doc.open();
            return doc.read();
        } else throw Exception;
    }

    그리고 이 메소드를 가지는 클래스는 아래처럼 정의할 수 있을 것입니다.

    이렇게 알고리즘의 세부 내역인 canOpenDocument, createDocument 등을 하위 클래스에게 넘기는 방식을 템플릿 메소드 패턴이라고 합니다.

    구조

    이야깃거리

    언제 써야 할까?

    • 하위 클래스가 알고리즘의 특정 단계만 정의할 수 있고 전체 알고리즘을 변경하진 못하게 하고 싶을 때
    • 알고리즘의 변하지 않는 부분을 한 번 구현하고 변할 수 있는 동작은 서브클래스에 맡기고 싶을 때

    장단점

    • (Pros) 사용자가 전체 알고리즘을 변경할 수 없다.
    • (Pros) 중복 코드를 일관되게 관리할 수 있다.
    • (Cons) 클래스 수가 많아짐.
    • (Cons) 서브 클래스가 구현해야 하는 스텝을 잘 고려해야 한다. 그렇지 않으면 의미없는 연산들이 추가될 수 있음.

    Case Study

    Case 1. java.util.AbstractList, AbstractSet, AbstractMap

    자바의 AbstractList,Set,Map에는 해당 자료구조에 유용한 메소드들을 제공합니다. 하지만 핵심 알고리즘인 get() 등의 메소드는 abstract 메소드로 정의하여 하위 클래스가 알고리즘의 특정 스텝을 구현하게 합니다.

    출처

    GoF Design Patterns

    'Design Patterns' 카테고리의 다른 글

    [Design Patterns] Visitor  (0) 2024.06.17
    [Design Patterns] Strategy  (0) 2024.06.16
    [Design Patterns] State  (0) 2024.06.09
    [Design Patterns] Observer  (0) 2024.06.09
    [Design Patterns] Memento  (0) 2024.06.06