본문 바로가기
Design Pattern

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

by 밍상 2023. 10. 26.

템플릿 메소드 패턴은

  • 알고리즘의 골격을 정의합니다.
  • 알고리즘의 일부 단계를 서브클래스에서 구현할 수 있으며,
  • 알고리즘의 구조는 그대로 유지하면서 특정 단계를 서브클래스에서 재정의할 수도 있습니다.

커피와 홍차 예제

public abstract class CaffeineBeverage {
    final void prepareRecipe() {
        boilWater();
        brew();
        pourInCup();
        addCondiments();
    }

    abstract void brew();
    abstract void addCondiments();

    private void boilWater() {
        //물 끓이기
    }

    private void pourInCup() {
        //컵에 따르기
    }
}
public class Coffee extends CaffeineBeverage{
    @Override
    void brew() {
        System.out.println("필터로 커피를 우려내는 중");
    }

    @Override
    void addCondiments() {
        System.out.println("설탕과 우유를 추가하는 중");
    }
}
public class Tea extends CaffeineBeverage{
    @Override
    void brew() {
        System.out.println("찻잎을 우려내는 중");
    }

    @Override
    void addCondiments() {
        System.out.println("레몬을 추가하는 중");
    }
}

 

예제

//추상 클래스로 선언되므로 서브클래스를 만들어야 함
public abstract class AbstractClass {
    
    //템플릿 메소드
    //알고리즘의 각 단계를 건드리지 못하게 final로 선언
    final void templateMethod() {
        primitiveOperation1();
        primitiveOperation2();
        concreteOperation();
        hook();
    }

    //서브 클래스에서 구현
    abstract void primitiveOperation1();
    abstract void primitiveOperation2();
    
    private void concreteOperation() {
        // 메소드 코드
    }

    //구상 메소드이지만 기능 X -> 서브클래스에서 오버라이드 할 수도 있고, 그러지 않아도 괜찮음
    private void hook() {
    }
}
  • primitiveOperation: 서브클래스에서 반드시 구현해야 함
  • concreteOperation: 추상클래스에서 정의됨
  • hook: 추상클래스에선 내용이 없고, 원한다면 서브 클래스에서 구현

 

할리우드 원칙

고수준 구성 요소 -> 저수준 구성 요소

"연락하지 마세요. 저희가 연락드리겠습니다."

 

의존성 부패(dependency rot)를 방지할 수 있음.

 

  • CaffeineBeverage: 고수준 구성 요소
  • Coffee, Tea: 저수준 구성 요소

 

참고

에릭 프리먼, 엘리자베스 롭슨, 케이시 시에라, 버트 베이츠. 『헤드퍼스트 디자인패턴 개정판』. 한빛미디어, 2022

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

상태 패턴 (State Pattern)  (0) 2023.11.06
반복자 패턴 (Iterator Pattern)  (0) 2023.10.30
퍼사드 패턴 (Facade Pattern)  (1) 2023.10.24
어댑터 패턴 (Adapter Pattern)  (0) 2023.10.23
커맨드 패턴 (Command Pattern)  (0) 2023.09.27