Development/디자인 패턴

[수정중] 헤드퍼스트 디자인 패턴 [8]

s3ich4n 2018. 1. 2. 16:21

헤드퍼스트 디자인 패턴[8]


  1. 템플릿 메소드 패턴


공통점을 뽑아내서 코딩해보자! 커피와 홍차를 만드는 클래스가 있다고 가정하자. 둘의 만드는 법은 각각 다음과 같다. 그리고 둘의 공통점을 찾아보자.


커피 만드는 레시피

  • 물을 끓인다
  • 끓는 물에 커피를 우려낸다
  • 커피를 컵에 따른다
  • 설탕과 우유를 추가한다


홍차 만드는 레시피

  • 물을 끓인다
  • 끓는 물에 차를 우려낸다
  • 차를 컵에 따른다
  • 레몬을 추가한다


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() 결과를 받고 알아서 정렬해줌.