템플릿 메소드(콜백) 패턴 (1)

1. 템플릿 메소드 패턴 정의

템플릿 메소드 패턴은 메소드에서 알고리즘의 골격을 정의합니다.
알고리즘의 일부는 서브클래스에서 구현해 특정 단계를 재정의 할 수 있습니다.
이런 특징으로 프레임워크 개발에 자주 쓰이는 패턴입니다.

1-1. 클래스 다이어그램

1-2. 코드

abstract class AbstractClass {
  final void templateMethod() {            // (1)
    primitiveOpertaion1();            
    primitiveOperation2();
    if (hook()) {
      concreteOperation();
    }
  }

  abstract void primitiveOpertaion1();     // (2)
  
  abstract void primitiveOperation2();

  final void concreteOperation() {
    // concreteOperation() 메소드 코드
  }

  void hook() { return false; }             // (3)
}
  • (1) : 템플릿 메소드 입니다. 서브클래스에서 알고리즘의 각 단계를 수정할 수 없도록 final 로 선언합니다.
  • (2) : 알고리즘의 일부로 서브클래스에서 구현해 특정 단계를 재정의 합니다.
  • (3) : 기본적으로 아무 작업을 하지 않지만 필요한 경우 서브클래스에서 오버라이드해 사용합니다.
    주로 필수적이지 않은 알고리즘을 구현할 때 사용하거나
    알고리즘의 특정 부분을 처리할지 결정하기 위한 용도로 사용할 수 있습니다.

1-3. 할리우드 원칙

메소드 템플릿 패턴을 사용하면 할리우드 원칙을 지킬 수 있습니다.
할리우드 원칙은 고수준 구성요소가 저수준 구성요소를 호출한다는 원칙입니다.
고수준 구성요소는 부모클래스 저수준 구성요소는 자식클래스로 볼 수 있습니다.
할리우드 원칙을 지키면 의존성 부패 현상을 피할 수 있습니다.

의존성 부패는 어떤 고수준 구성요소가 저수준 구성요소에 의존하고,
그 저수준 구성요소는 다시 고수준 구성요소에 의존하고,
그 고수준 구성요소는 다시 또 다른 구성요소에 의존하고… 와 같은 식으로 의존성이 복잡하게 꼬여
뒤죽박죽 호출되는 현상을 말합니다.

할리우드 원칙을 지키면 고수준 구성요소가 저수준 구성요소를 호출해
의존성이 한 방향으로 흐르도록 만들 수 있습니다.

1-4. 전략 패턴과 차이

전략 패턴과 템플릿 메소드 패턴은 알고리즘을 변하는 것으로 간주하고
추가, 수정, 변경이 쉽도록 하는 공통점이 있습니다.
하지만 세부적으로 살펴보면 다음과 같은 차이점이 있습니다.

전략 패턴은 각 알고리즘을 캡슐화 하고 알고리즘군을 정의해 그 알고리즘들을 선택 하며 사용할 수 있습니다.
템플릿 메소드 패턴은 알고리즘의 개요를 정의 하고 실제 작업 중 일부는 서브클래스에서 구현하도록 합니다.

알고리즘이 전부 똑같고 그 중 일부만 다르다면 코드를 재사용하며 서브클래스에서 일부 행동을
구현할 수 있기 때문에 템플릿 메소드 패턴을 사용하는 것이 전략 패턴을 사용하는 것 보다 효율적 입니다.

전략 패턴은 인터페이스를 활용한 구성(Composition)을 사용하기 때문에
알고리즘 추가, 수정, 변경에 더 유연하다는 장점이 있습니다.