Table of Contents
[GoF 디자인 패턴] 템플릿 메서드 (Template Method) 패턴
템플릿 메서드 (TemplateMethod) 패턴
행동(behavioral) 패턴 중 하나로, 상위 클래스에서 공통적인 로직을 정의하고, 하위 클래스에서 상속받아 일부 메서드를 오버라이드하여 각 하위 클래스가 자신에게 맞게 변경할 수 있는 패턴이다.
하나의 알고리즘을 정의하고, 이 알고리즘을 실행하는 여러 단계의 메서드를 제공한다. 이때, 알고리즘의 일부를 하위 클래스에서 재정의할 수 있다.
템플릿 메서드 구성요소
- Abstract Class (추상 클래스) : 추상 메서드와 구체적인 메서드로 이루어져 있다. 추상 메서드는 반드시 구현해야 하며, 구체적인 메서드는 구현하지 않아도 된다.
- Concrete Class (구체 클래스) : 추상 클래스를 상속받아 추상 메서드를 구현한 클래스. 구체적인 메서드를 상속받고 필요한 추상 메서드를 구현한다.
- Client : 템플릿 메서드 패턴을 사용하는 클래스.
구성 예제
공통적인 로직을 정의하는 Abstract Class를 선언해준다.
1public abstract class Computer {
2
3 abstract void initialize();
4 abstract void turnOn();
5 abstract void turnOff();
6
7 // 오버라이딩 할 수 없도록 final 사용
8 public final void open() {
9 initialize();
10 turnOn();
11 turnOff();
12 }
13}
initialize(), turnOn(), turnOff() 라는 추상 메서드와 open() 이라는 구체적인 메서드가 선언되어 있다. 상위 클래스에서 전체적인 알고리즘의 흐름을 정의하고, 하위 클래스에서 세부 구현을 위임한다.
→ “코드 재사용성을 높이고, 유연성을 제공한다.”
Abstract Class를 상속받은 Concrete Class를 만든다.
1public class Samsung extends Computer {
2 @Override
3 void initialize() {
4 System.out.println("삼성 컴퓨터입니다.");
5 }
6
7 @Override
8 void turnOn() {
9 System.out.println("삼성 컴퓨터 전원을 킵니다.");
10 }
11
12 @Override
13 void turnOff() {
14 System.out.println("삼성 컴퓨터 전원을 끕니다.");
15 }
16}
추상 메서드인 initialize(), turnOn(), turnOff()를 구현한다. Abstract Class(Computer) 클래스를 상속받았기 때문에 open() 메서드를 호출할 수 있다.
→ “하위 클래스에서 상위 클래스의 알고리즘을 재사용하여 유연성을 제공한다.”
템플릿 메서드 패턴을 사용하는 Client 클래스이다.
1Computer samsung = new Samsung();
2samsung.open();
3
4Computer lg = new LG();
5lg.open();
Computer 추상 클래스를 상속받은 Samsung, LG 인스턴스를 생성하고 open() 메서드를 호출한다. 각각 Computer 추상클래스를 오버라이딩하여 구현한 결과를 실행하게 된다.
템플릿 메서드 패턴 고려사항
여러 클래스가 공통된 알고리즘을 가지고 있지만 구현 방법이 다를 경우 템플릿 메서드 패턴을 유용하게 사용할 수 있다. 하지만 알고리즘이 너무 단순하거나, 구현 방법이 변경될 가능성이 없는 경우, 구체 클래스를 상속받아 템플릿 메서드를 사용하는 경우에는 적절하지 않다.
템플릿 메서드 사용 시 장점
- 코드를 재사용할 수 있다.
- 일관성 있는 코드를 작성할 수 있다.
- 코드의 가독성과 유지보수성이 향상된다.
템플릿 메서드 사용 시 단점
- 상위 클래스에서 알고리즘의 골격을 정의하기 때문에, 하위 클래스는 골격을 변경할 수 없어 유연성이 떨어진다.
- 구조변경이 어려워 확장성이 어렵다.
- 상위 클래스에서 구현한 코드가 하위 클래스에서 필요하지 않더라도 상속받게 되므로 불필요한 코드가 포함될 수 있다.