디자인 패턴

template method pattern

kyoulho 2024. 7. 5. 18:02

 

템플릿 메소드 패턴은 알고리즘의 일부 단계를 서브클래스에서 구현할 수 있으며, 알고리즘의 구조는 그대로 유지하면서 알고리즘의 특정 단계를 서브클래스에서 재정의한다.

템플릿 메소드 패턴의 구성 요소

  1. AbstractClass (추상 클래스)
    • 알고리즘의 템플릿을 정의하는 클래스로, 템플릿 메소드를 포함하고 있다.
    • 템플릿 메소드는 알고리즘의 구조를 정의하고, 일부 단계는 추상 메소드나 구현된 메소드를 활용하여 구현한다.
    • 훅(Hook)을 사용하여 서브클래스에서 알고리즘의 특정 지점에 추가적인 동작을 삽입할 수 있다.
  1. ConcreteClass (구체 클래스)
    • AbstractClass를 상속받아 템플릿 메소드에서 정의된 추상 메소드들을 구현하는 클래스이다.
    • 알고리즘의 일부 단계를 재정의하여 구체적인 동작을 제공한다.
    • 필요에 따라 후크를 오버라이딩하여 추가 동작을 삽입할 수 있다.

 

훅(Hook)의 사용

훅은 추상 클래스에서 비어있는 메소드이며, 서브클래스에서 필요에 따라 오버라이딩하여 사용할 수 있는 지점을 제공한다.
훅을 통해 서브클래스는 알고리즘의 중간 단계나 특정 지점에서 추가적인 동작을 삽입할 수 있다.

 

예제

// 음료를 만드는 알고리즘의 템플릿을 정의하는 클래스
abstract class BeverageTemplate {
    // 템플릿 메소드: 알고리즘의 구조를 정의
    final void makeBeverage() {
        boilWater();
        brew();
        pourInCup();
        if (customerWantsCondiments()) {
            addCondiments();
        }
    }

    // 일부 단계는 추상 메소드로 선언하여 서브클래스에서 구현
    abstract void brew();

    abstract void addCondiments();

    // 구현된 후크 메소드
    void boilWater() {
        System.out.println("물 끓이는 중");
    }

    void pourInCup() {
        System.out.println("컵에 따르는 중");
    }

    // 선택적으로 오버라이드할 후크 메소드
    boolean customerWantsCondiments() {
        return true;
    }
}

// 추상 클래스를 상속받아 구체적인 동작을 구현하는 클래스
class Coffee extends BeverageTemplate {
    @Override
    void brew() {
        System.out.println("커피를 내리는 중");
    }

    @Override
    void addCondiments() {
        System.out.println("설탕과 우유를 추가하는 중");
    }

    // 후크 메소드를 오버라이드하여 선택적으로 동작을 변경
    @Override
    boolean customerWantsCondiments() {
        String answer = getUserInput();
        return answer.toLowerCase(Locale.ROOT).equals("y");
    }

    private String getUserInput() {
        Scanner scanner = new Scanner(System.in);
        System.out.println("커피에 우유와 설탕을 넣을까요? (y/n)");
        return scanner.next();
    }
}

// 클라이언트
public class Client {
    public static void main(String[] args) {
        // Coffee를 만드는 알고리즘 수행
        BeverageTemplate coffee = new Coffee();
        coffee.makeBeverage();
    }
}

'디자인 패턴' 카테고리의 다른 글

State Pattern  (0) 2024.06.15
Singletone Pattern  (0) 2024.06.15
Proxy Pattern  (0) 2024.06.15
Observer Pattern  (0) 2024.05.30
Mediator Pattern  (0) 2024.05.28