[디자인패턴 수업 13주차 2차시] 템플릿 메서드와 후크(Hook)

Jin Hur·2021년 11월 23일
1
post-custom-banner

reference: https://astrod.github.io/[Head%20First]%20%ED%85%9C%ED%94%8C%EB%A6%BF%20%EB%A9%94%EC%86%8C%EB%93%9C%20%ED%8C%A8%ED%84%B4/

후크(Hook)

추상클래스에서 구현되는 메서드긴 하지만, 기본적인 내용만 구현되어 있거나 아무 코드도 들어있지 않은 메서드이다.
서브클래스 입장에서는 알고리즘에 끼어들 수 있다.

public abstract class CaffeineBeverageWithHook {
    
    void prepareRecipe() {
        boilWater();
        brew();
        pourInCup();
        if (customerWantsCondiments()) {
            addCondiments();
        }
    }
    
    abstract void brew();
    abstract void addCondiments();
    
    void boilWater() {
        System.out.println("물 끓이는 중");
    }
    
    /**
    * 이 메소드는 후크 메소드로, 필요한 경우에는 하위 클래스에서 오버라이드 할 수 있다. 
    */
    boolean customerWantsCondiments() {
        return true;
    }
}

후크 활용

후크를 서브클래스에서 오버라이딩하여 활용한다. 이 예에선 알고리즘의 특정 부분(addCondiments)을 어떻게 처리할지 여부를 결정하기 위한 용도로 후크를 사용한다.

public class CoffeeWithHook extends CaffeineBeverageWithHook{
    public void brew() {
        // implements
    }

    public void addCondiments() {
        // implements
    }

    public boolean customerWantsCondiments() {
        String answer = getUserInput();

        if (answer.toLowerCase().startsWith("y")) {
            return true;
        }

        return false;
    }

    private String getUserInput() {
        String answer = null;

        System.out.println("커피에 우유와 설탕을 넣어 드릴까요?");

        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

        try {
            answer = in.readLine();
        } catch (IOException ex) {
            System.err.println("IO 오류");
        }

        if (answer == null) {
            return "no";
        }

        return answer;
    }
}

정리

  1. 알고리즘에서 특정 단계를 제공해야만 하는 경우는 추상 메서드를 사용한다. 단, 알고리즘의 특정 부분이 선택적으로 적용된다면 후크(hook)를 사용하면 된다. (어떤 카페인 음료에서는 특정 단계를 거치지 않아도 되므로, 이를 후크로써 선택적 적용을 취한다.)
  2. 후크는 템플릿 메서드에서 앞으로 발생할 일 또는 막 일어난 일에 대해 서브클래스에서 반응할 기회를 제공하기 위한 용도로 사용.
  3. 서브클래스에서는 모든 추상메서드를 정의하여야 한다. 그렇기 때문에, 추상 메서드가 너무 많아지면 좋지않다. 그러나 너무 메서드를 큼직하게 나눠 놓으면 유연성이 떨어진다. 후크를 추상 클래스에 구현을 해 놓아 서브클래스 구현의 부담을 줄인다.
post-custom-banner

0개의 댓글