[수정중] 헤드퍼스트 디자인 패턴 [8]
헤드퍼스트 디자인 패턴[8]
- 템플릿 메소드 패턴
공통점을 뽑아내서 코딩해보자! 커피와 홍차를 만드는 클래스가 있다고 가정하자. 이 둘의 만드는 법은 각각 다음과 같다. 그리고 이 둘의 공통점을 찾아보자.
커피 만드는 레시피
- 물을 끓인다
- 끓는 물에 커피를 우려낸다
- 커피를 컵에 따른다
- 설탕과 우유를 추가한다
홍차 만드는 레시피
- 물을 끓인다
- 끓는 물에 차를 우려낸다
- 차를 컵에 따른다
- 레몬을 추가한다
prepareRecipe까지 추상화할 수 있다! prepareRecipe 같은 것이 템플릿 메소드!
우려낸다 / 첨가물을 추가한다는 하나로 합칠 수 있는 기능이다. 이런것들은 서브클래스에 의존한다. 물끓이고 음료를 컵에 붓는건 걍 여기서 구현한다.
템플릿 메소드에서는 알고리즘의 각 단계들을 정의하며, 그 중 한개 이상의 단계가 서브클래스에 의해 제공될 수 있다.
- 알고리즘이 한 클래스에 독점됨
- 서브클래스에서 코드 재사용이 쉬움
- 알고리즘이 한군데에 모여있음 -> 그부분만 수정하면 됨
- 다른 요소들 추가/삭제가 편한 프레임워크 제작이 가능
- 일련의 단계들로 알고리즘을 정의한 메소드를 만듦. 일부 구현만 서브클래스에 의존.
이것이 바로 템플릿 메소드 패턴!
템플릿 메소드 패턴: 메소드에서 알고리즘의 골격을 정의함. 알고리즘의 여러 단계 중 일부는 서브클래스에서 구현가능. 이를통해 알고리즘의 구조는 그대로 유지하면서 서브클래스에서 특정 단계를 재정의할 수 있음.
이를 사용하면 서브클래스에서 일부분을 구현할 수 있도록 하면서도 알고리즘의 구조는 바꾸지 않아도 되도록 할 수 있다.
----
템플릿 메소드 패턴에서는 concreteOperation에 final 키워드를 붙이는 것으로 서브클래스에서 오버라이드를 못하게 할 수도 있다. 즉 템플릿 메소드에서 직접 호출하거나 서브클래스에서 호출해서 사용할 수 있다.
hook은 추상 클래스에서 선언되는 메소드. 기본적인 것만 구현되어 있거나 아무 코드도 들어있지 않은 메소드.
--------------------------------------------------------------------
| 디자인 원칙 - 8 : 헐리우드 원칙. 먼저 연락하지 마세요. 저희가 연락하겠습니다. |
--------------------------------------------------------------------
헐리우드 원칙을 쓰면 의존성 부패(dependency rot)를 방지할 수 있다.
의존성 부패: 여러 구성요소들이 서로 의존성에 의해 배배꼬여있음.
저수준 구성요소도 컴퓨테이션에 참가할 수 있다.
하지만 언제, 어떤식으로 쓰는지는 고수준 구성요소에 의해 결정된다.
저수준 구성요소에서는 절대 고수준 구성요소를 직접 부를 수 없다.
템플릿 메소드를 이용한 실제 예시: Comparable을 implement해서 오리 크기를 정렬하자!
Comparable 인터페이스는 compareTo() 메소드만 있다.
https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html
주석처리된 소스코드에 따라 바로 처리하면 sort가 compareTo()의 결과를 받고 알아서 정렬해줌.