Template Method Pattern
헐리우드 원칙
먼저 연락하지 마세요. 저희가 연락 드리겠습니다.
헐리우드 원칙을 적용을 활용하면 "의존성 부패(dependency rot)"를 방지할 수 있습니다.
저수준 구성요소에서 시스템에 접속을 할수는 있지만, 언제 어떤 식으로 그 구성요소들을 사용할지는 고수준 구성요소에서 결정하게 됩니다. 즉, 고수준 구성요소에서는 저수준 구성요소에게 "먼저 연락하지 마세요. 제가 먼저 연락 드리겠습니다."라고 얘기를 하는 것과 같죠
Arrays.sort() 도 변형된 템플릿 메소드 패턴 입니다.
객체지향 원칙
- 바뀌는 부분은 캡슐화 한다.
- 상속보다는 구성을 활용한다.
- 구현이 아닌 인터페이스에 맞춰서 프로그래밍한다.
- 서로 상호작용을 하는 객체 사이에서는 가능하면 느슨하게 결합하는 디자인을 사용해야 한다.
- 클래스는 확장에 대해서는 열려있지만 변경에 대해서는 닫혀있어야 한다.(OCP)
- 추상화된 것에 의존하라. 구상 클래스에 의존하지 않도록 한다.
- 친한 친구들하고만 이야기 한다.
- 먼저 연락하지 마세요. 저희가 연락 드리겠습니다.
핵심 정리
- "템플릿 메소드"에서는 알고리즘의 단계들을 정의하는데, 일부 단계는 서브클래스에서 구현하도록 할 수 있습니다.
- 템플릿 메소드 패턴은 코드 재사용에 크게 도움이 됩니다.
- 템플릿 메소드가 들어있는 추상클래스에서는 구상 메소드, 추상 메소드, 후크를 정의할 수 있습니다.
- 추상 메소드는 서브클래스에서 구현합니다.
- 후크(hook)는 추상 클래스에 들어있는, 아무 일도 하지 않거나 기본 행동을 정의하는 메소드로, 서브클래스에서 오버라이드 할 수 있습니다.
- 서브클래스에서 템플릿 메소드에 들어있는 알고리즘을 함부로 바꾸지 못하게 하고 싶다면 템플릿 메소드를 final로 선언하면 됩니다.
- 헐리우드 원칙에 의하면, 저수준 모듈을 언제 어떻게 호출할지는 고수준 모듈에서 결정하는 것이 좋습니다.
- 템플릿 메소드 패턴은 실전에서도 꽤 자주 쓰이지만 반드시 "교과서적인" 방식으로 적용되진 않습니다.
- 스트래티지 패턴과 템플릿 메소드 패턴은 모두 알고리즘을 캡슐화하는 패턴이지만 전자에서는 구성을, 후자에서는 상속을 이용합니다.
정의
메소드에서 알고리즘의 골격을 정의합니다. 알고리즘의 여러 단계 중 일부는 서브클래스에서 구현할 수 있습니다. 템플릿 메소드를 이용하면 알고리즘의 구조는 그대로 유지하면서 서브클래스에서 특정 단계를 재정의할 수 있습니다.
간단하게 말하자면 알고리즘의 틀을 만들기 위한 것입니다. 일련의 단계들로 알고리즘을 정의한 메소드 입니다. 여러 단계 가운데 하나 이상이 추상 메소드로 정의되며, 그 추상 메소드는 서브클래스에서 구현됩니다.
abstract class AbstractClass { final void templateMethod() { primitiveOperation1(); primitiveOperation2(); if (hook()) { concreteOperation(); } } // 알고리즘의 일부를 구상 서브 클래스에서 구현한다. abstract void primitiveOperation1(); abstract void primitiveOperation2(); /** * 기본적으로 아무것도 하지 않는 구상 메소드를 정의할 수도 있습니다. * 이런 메소드는 "후크(hook)"라고 부릅니다. * 서브클래스에서 오버라이드 할 수도 있지만 반드시 그래야 하는건 아니죠. * 서브 클래스에서 오버라이드를 해서 알고리즘의 일부를 변경 할 수 있습니다. */ boolean hook() { return true; } void concreteOperation() { // TO DO } }
헐리우드 원칙
먼저 연락하지 마세요. 저희가 연락 드리겠습니다.
헐리우드 원칙을 적용을 활용하면 "의존성 부패(dependency rot)"를 방지할 수 있습니다.
저수준 구성요소에서 시스템에 접속을 할수는 있지만, 언제 어떤 식으로 그 구성요소들을 사용할지는 고수준 구성요소에서 결정하게 됩니다. 즉, 고수준 구성요소에서는 저수준 구성요소에게 "먼저 연락하지 마세요. 제가 먼저 연락 드리겠습니다."라고 얘기를 하는 것과 같죠
Arrays.sort() 도 변형된 템플릿 메소드 패턴 입니다.
객체지향 원칙
- 바뀌는 부분은 캡슐화 한다.
- 상속보다는 구성을 활용한다.
- 구현이 아닌 인터페이스에 맞춰서 프로그래밍한다.
- 서로 상호작용을 하는 객체 사이에서는 가능하면 느슨하게 결합하는 디자인을 사용해야 한다.
- 클래스는 확장에 대해서는 열려있지만 변경에 대해서는 닫혀있어야 한다.(OCP)
- 추상화된 것에 의존하라. 구상 클래스에 의존하지 않도록 한다.
- 친한 친구들하고만 이야기 한다.
- 먼저 연락하지 마세요. 저희가 연락 드리겠습니다.
핵심 정리
- "템플릿 메소드"에서는 알고리즘의 단계들을 정의하는데, 일부 단계는 서브클래스에서 구현하도록 할 수 있습니다.
- 템플릿 메소드 패턴은 코드 재사용에 크게 도움이 됩니다.
- 템플릿 메소드가 들어있는 추상클래스에서는 구상 메소드, 추상 메소드, 후크를 정의할 수 있습니다.
- 추상 메소드는 서브클래스에서 구현합니다.
- 후크(hook)는 추상 클래스에 들어있는, 아무 일도 하지 않거나 기본 행동을 정의하는 메소드로, 서브클래스에서 오버라이드 할 수 있습니다.
- 서브클래스에서 템플릿 메소드에 들어있는 알고리즘을 함부로 바꾸지 못하게 하고 싶다면 템플릿 메소드를 final로 선언하면 됩니다.
- 헐리우드 원칙에 의하면, 저수준 모듈을 언제 어떻게 호출할지는 고수준 모듈에서 결정하는 것이 좋습니다.
- 템플릿 메소드 패턴은 실전에서도 꽤 자주 쓰이지만 반드시 "교과서적인" 방식으로 적용되진 않습니다.
- 스트래티지 패턴과 템플릿 메소드 패턴은 모두 알고리즘을 캡슐화하는 패턴이지만 전자에서는 구성을, 후자에서는 상속을 이용합니다.
'Programs > Design Pattern' 카테고리의 다른 글
디자인 패턴(Design Pattern) - State Pattern (1) | 2011.10.18 |
---|---|
디자인 패턴(Design Pattern) - Iterator Pattern, Composite Pattern (2) | 2011.10.18 |
디자인 패턴(Design Pattern) - Adapter Pattern, Facade Pattern (1) | 2011.10.05 |
디자인 패턴(Design Pattern) - Command Pattern (2) | 2011.10.04 |
디자인 패턴(Design Pattern) - Singleton Pattern (1) | 2011.09.27 |