Template Method

Template Method 패턴은 알고리즘의 전체적인 뼈대를 추상 클래스에 정의해두고, 그 중 일부 구체적인 단계는 서브클래스에서 구현하도록 위임하는 디자인 패턴입니다.

           +-------------------------+
           |    AbstractClass        |  <-- 템플릿 메서드 정의
           +-------------------------+
           | + templateMethod()      |  <-- 알고리즘의 전체 구조
           |   {                   } |
           |                         |
           | - primitiveOperation1() |  <-- 구현은 서브클래스에 위임
           | - primitiveOperation2() |  <-- 구현은 서브클래스에 위임
           +-------------------------+
                     /   \
                    /     \
                   /       \
   +----------------+   +----------------+
   | ConcreteClass1 |   | ConcreteClass2 |  <-- 구체적인 구현 클래스들
   +----------------+   +----------------+
   | + primitiveOperation1() 구현  | 
   | + primitiveOperation2() 구현  | 
   +----------------+   +----------------+

즉, 알고리즘의 공통 부분은 부모 클래스에서 처리하고, 변하는 부분은 자식 클래스에서 구현하여 코드의 중복을 줄이고, 알고리즘의 일관성을 유지할 수 있습니다.

How do Code?

// 추상 클래스: 알고리즘의 뼈대를 정의하는 템플릿 메서드 포함
public abstract class AbstractClass {
    
    // 템플릿 메서드: 알고리즘의 전체 구조를 정의하며, 일부 단계는 추상 메서드로 위임
    public final void templateMethod() {
        primitiveOperation1();
        primitiveOperation2();
        concreteOperation();
    }
    
    // 서브클래스에서 구현할 추상 메서드들
    protected abstract void primitiveOperation1();
    protected abstract void primitiveOperation2();
    
    // 공통으로 사용되는 구체적인 메서드 (필요에 따라 오버라이딩 가능)
    private void concreteOperation() {
        System.out.println("AbstractClass의 공통 작업 수행");
    }
}

// 구체적인 구현 클래스 1
public class ConcreteClass1 extends AbstractClass {
    @Override
    protected void primitiveOperation1() {
        System.out.println("ConcreteClass1: primitiveOperation1 수행");
    }
    
    @Override
    protected void primitiveOperation2() {
        System.out.println("ConcreteClass1: primitiveOperation2 수행");
    }
}

// 구체적인 구현 클래스 2
public class ConcreteClass2 extends AbstractClass {
    @Override
    protected void primitiveOperation1() {
        System.out.println("ConcreteClass2: primitiveOperation1 수행");
    }
    
    @Override
    protected void primitiveOperation2() {
        System.out.println("ConcreteClass2: primitiveOperation2 수행");
    }
}
  • 템플릿 메서드(templateMethod()) 알고리즘의 전체 흐름을 정의합니다. 템플릿 메서드 내에서 공통으로 수행해야 하는 단계와, 서브클래스에서 각각 다르게 구현해야 하는 추상 메서드를 호출합니다.

  • primitiveOperation1()와 primitiveOperation2() 서브클래스에서 구체적으로 구현할 메서드입니다. 이 메서드들이 알고리즘의 변경 가능한 부분을 담당합니다.

  • concreteOperation() 알고리즘에서 변경되지 않고 공통으로 수행되는 작업으로, 보통 private 메서드로 정의되어 서브클래스에서 오버라이딩하지 않습니다.

  • 장점 알고리즘의 공통 부분과 변화하는 부분을 분리함으로써 코드 재사용성을 높이고, 알고리즘의 구조를 일정하게 유지할 수 있습니다.

Last updated