Post

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

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

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

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

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

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

1-2. 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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)을 사용하기 때문에
알고리즘 추가, 수정, 변경에 더 유연하다는 장점이 있습니다.

This post is licensed under CC BY 4.0 by the author.