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

code reference

템플릿 메소드(Template Method)에서는 알고리즘의 각 단계들을 정의하며, 그 중 한 개 이상의 단계가 서브클래스에 의해 제공될 수 있습니다.

아래 예시를 살펴보면 CaffeineBeverage 클래스에서 알고리즘을 독점하고 있는 것(prepareRecipe)을 볼 수 있습니다. 그리고 이 알고리즘의 일부 구현만 서브 클래스에 의존합니다. 그래서 알고리즘은 한 군데에 있기 때문에 그 부분만 고치면 됩니다.

CaffeineBeverage.java

public abstract class CaffeineBeverage {

    final void prepareRecipe() {
        boilWater();
        brew();
        pourInCup();
        addCondiments();
    }

    abstract void brew();

    abstract void addCondiments();

    void boilWater() {
        System.out.println("boiling water ...");
    }

    void pourInCup() {
        System.out.println("pouring in cup ...");
    }
}

Coffee.java

public class Coffee extends CaffeineBeverage {

    @Override
    void brew() {
        System.out.println("brewing coffee ...");
    }

    @Override
    void addCondiments() {
        System.out.println("adding sugar and milk ...");
    }

}

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

Head First Design Patterns의 책에서는 템플릿 메소드 패턴을 아래와 같이 정의하고 있습니다.

템플릿 메소드 패턴(Template Method Pattern)에서는 알고리즘의 골격을 정의합니다. 알고리즘의 여러 단계 중 일부는 서브클래스에서 구현할 수 있습니다. 템플릿 메소드를 이용하면 알고리즘의 구조는 그대로 유지하면서 서브클래스에서 특정 단계를 재정의할 수 있습니다.

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

템플릿 메소드 패턴의 기본 구조는 아래와 같습니다.

  • 알고리즘은 final로 지정하여 서브클래스에서 수정할 수 없도록 하였습니다.
  • 알고리즘의 일부 구현은 서브클래스에서 담당하도록 합니다.
  • hook() 다양한 용도로 사용할 수 있습니다.
public abstract class AbstractClass {

    final void templateMethod() {
        primitiveOperation1();
        primitiveOperation2();
        concreteOperation();
        hook();
    }

    abstract void primitiveOperation1();

    abstract void primitiveOperation2();

    final void concreteOperation() {}

    void hook() {}
}

헐리우드 원칙

헐리우드 원칙
먼저 연락하지 마세요. 저희가 연락 드리겠습니다 .

헐리우드 원칙을 활용하면 "의존성 부패(dependency rot)"를 방지할 수 있습니다. 의존성이 복잡하게 꼬여있는 것을 의존성 부패라고 부릅니다. 의존성이 부패되면 시스템이 어떤 식으로 디자인된 것인지 거의 아무도 알아볼 수 없게 됩니다.

템플릿 메소드 패턴은 헐리우드 원칙을 적용한 패턴이라고 할 수 있습니다.

profile
재밌는 것만 하고 싶어 ʕ•ﻌ•ʔ

0개의 댓글