코드/GOF

디자인 패턴 - 행위(Behavioral) 패턴 (2) 템플릿 메소드 패턴(Template MethodPattern)

미로처럼 2024. 3. 18. 10:56
728x90

여러 클래스에서 공통으로 사용하는 메서드를 템플릿화 하여 상위 클래스에서 정의하고, 하위클래스마다 세부 동작 사항을 다르게 구현하는 패턴이다.

 

변하지 않는 기능(템플릿)은 상위 클래스에 만들어 두고 자주 변경되며 확장할 기능은 하위 클래스에서 만들도록 하여 상위의 메소드 실행 동작 순서는 고정하면서 세부 실행 내용은 다양화 도리 수 있는 경우에 사용된다.

 

템플릿 메소드 패턴은 상속이라는 기술을 극대화하여, 알고리즘의 뼈대를 맞추는 것에 초점을 둔다.

 

구조

 

 

  • AbstractClass(추상 클래스)
    • 템플릿 메소드를 구현하고, 템플렛 메소드에서 돌아가는 추상 메소드를 선언한다. 이 추상 메소드는 하위 클래스인 ConcreteClass 역할에 의해 구현된다.

 

  • ConcreteClass(구현 클래스)
    • AbstarctClass를 상속하고 추상 메소드를 구체적으로 구현. ConcreteClass에서 구현한 메소드는 AbstractClass의 템플릿 메소드에서 호출

 

 

hook 메서드

 

훅(hook) 메소드는 부모의 템플릿 메소드의 영향이나 순서를 제어하고 싶을때 사용되는 메서드 형태를 말한다. 



위의 그림에서 보듯이 템플릿 메서드 내에 실행되는 동작을 step2() 라는 메서드의 참, 거짓 유무에 따라 다음 스텝을 어떻게 이어나갈지 지정한다. 이를 통해 자식 클래스에서 좀더 유연하게 팀플렛 메서드의 알고리즘 로직을 다양화 할 수 있다는 특징이 있다.

hook 메소드는 추상 메소드가 아닌 일반 메소드로 구현하는데, 선택적으로 오버라이드 하여 자식 클래스에서 제어하거나 아니면 놔두거나 하기 위해서 이다.

 

 

클래스 구성

 

 

 

클래스 흐름

 

 

특징

 

사용시기 

  • 클라이언트가 알고리즘의 특정 단계만 확장하고 전체 알고리즘이나 해당 구조는 확장하지 않도록 할때
  • 동일한 기능은 상위 클래스에서 정의하면서 확정, 변화가 필요한 부분만 하위 클래스에서 구현 

 

장점

  • 클라이언트가 대규모 알리고리즘의 특정 부분만 재정의하도록 하여, 알고리즘의 다른 부분에 발생하는 변경 사항의 영향을 덜 받도록 한다.
  • 상위 추상클래스로 로직을 공통화 하여 코드의 중복을 줄일 수 있다.
  • 서브 클래스의 역할을 줄이고, 핵심 로직을 상위 클래스에서 관리하므로서 관리가 용이해진다.
    • 헐리우도 원착(Hollywood Principle): 고수준 구성요소에서 저수준을 다루는 원칙(추상화에 의존)

 

단점

  • 알고리즘의 제공된 골격에 의해 유연성이 제한될 수 있다.
  • 알고리즘 구조가 복잡할수록 템플릿 로직 형애트를 유지하기 어려워진다.
  • 추상메소드가 많아지면서 클래스의 생성, 관리가 어려워질 수 있다.
  • 상위 클래스에서 선언된 추상 메소드를 하위 클래스에서 구현할 때, 그 메소드가 어느 타이밍에서 호툴되는지 클래스 로직을 이해해야 할 필요가 있다.
  • 로직에 변화가 생겨 상위 클래스를 수정할 때, 모든 서브 클래스의 수정이 필요 할 수도 있다.
  • 하위 클래스를 통해 기본단계 구현을 억제하여 리스코프 치환법칙 위반 여지 있음.

 

728x90