후크(hook)는 추상 클래스에서 선언되는 메서드긴 하지만 기본적인 내용만 구현되어있거나, 아무 코드도 들어 있지 않은 메서드 이다. 이렇게 하면 서브 클래스 입장에서는 다양한 위치에서 알고리즘에 끼어들 수 있다. 물론 그냥 무시하고 넘어갈수도 있지만 ㅎ
* (이전 포스트 http://asuraiv.blogspot.kr/2014/07/template-method-pattern-1_9.html 를 읽어야 아래 설명들을 이해할수 있다)
아래 CaffeineBeverage 클래스의 음료에 첨가물을 추가하는 addCondiments() 의 호출을, 고객이 원할때만 호출될 수 있도록 조건문을 새로 만들었다. 호출여부는 customerWantsCondisments() 메서드의 리턴값(boolean)이 결정한다.
기본적으로 customerWantsCondiments 메서드는 true를 리턴하지만 서브클래스에서 오버라이드 함으로써 얼마든지 조건을 변경할 수 있다.
이제 후크를 활용하여 서브클래스를 개선해보자.
아래는 Coffee 클래스에 후크를 활용한 예이다.
후크를 활용하여 Coffee 클래스를 개선했다. 수퍼클래스 템플릿 메서드인 prepareReceipe 메서드의 각 알고리즘 단계중 addCondiments 메서드의 수행 여부를 서브클래스에서 결정하기 위해 customerWantsCondiments 를 오버라이드 했다.
물론 첨가물을 넣을지 말지는 고객이 결정해야 하므로, 입력값을 받아 그 입력값에 따라 true혹은 false를 리턴하도록 구현 했다.
이제 위 설계를 테스트 하기위한 코드를 작성해보자.
이 테스트 코드를 수행한 결과는 아래와 같다.
hook 적용 |
이제 hook 라는것이 정확히 어떤 용도로 쓰여야 하는지 정리해 보자
1. 알고리즘에서 필수적이지 않은 부분을 필요에 따라 서브클래스에서 구현하는 경우
2. 템플릿 메소드(위에서는 prepareReceipe메서드)에서 앞으로 일어날일 또는 막 일어난 일에 대해 서브클래스에서 반응할 기회를 제공
3. 서브클래스에 수퍼클래스에서 진행되는 작업에 대한 결정을 내리는 기능을 부여하기 위한 용도 (음료에 첨가물을 넣을건지 말건지)
정리하고 보니 더욱더 유연하고 자유도가 높은 알고리즘을 설계할 수 있을것같다.
템플릿 메서드 패턴은 이정도로 마친다.
댓글 없음:
댓글 쓰기