디자인 패턴

템플릿 메서드 패턴 (Template Method Pattern)

DevHyo 2022. 4. 28. 22:42

부모 클래스에 알고리즘의 골격인 템플릿을 정의하고, 일부 변경되는 로직은 자식 클래스에서 정의하는 것이다. 이렇게 하면 자식 클래스가 알고리즘의 전체 구조를 변경하지 않고, 특정 부분만 재정의할 수 있다.

상속과 오버 라이딩을 통한 다형성으로 문제를 해결하는 것

Spring Batch의 AbstractJob 추상 클래스

Spring Batch에 Job 인터페이스를 구현한 AbstractJob 추상 클래스와 그 하위 구현체들은 템플릿 메서드 패턴을 기반으로 구현되어 있다.

위의 구조를 설명하자면, AbstractJob 추상 클래스에는 doExecute() 추상 메서드가 있고, execute() 메서드에서 doExecute() 메서드를 실행한다. 그리고 doExecute() 추상 메서드는 하위 구현체인 SimpleJob 또는 FlowJob 클래스에서 재정의를 한다. 즉, 공통된 템플릿 기능은 부모 클래스에 정의되어 있고(execute 메서드), 자주 변하는 알고리즘들은 하위 클래스에서 구현되어 있다.(doExecute 메서드)


단점

  • 자식 클래스와 부모 클래스가 컴파일 시점에 강하게 결합되어 있다는 점이 문제이다.
  • 자식 클래스가 부모 클래스에 의존하고 있기 때문에 자식 클래스에 부모 클래스의 코드가 명확하게 적혀있다.


대안

  • 상속보다는 위임, 컴포지션, 구성이라는 방법을 사용해야 한다.
  • 템플릿 메서드 패턴과 비슷한 역할을 하면서 상속의 단점을 제거할 수 있는 전략 패턴(Strategy Pattern)이 있다.