템플릿 메소드 패턴이란?
템플릿 메소드 패턴이란 특정 작업을 처리하는 일부분을 서브 클래스로 캡슐화하여 전체적인 구조는 바꾸지 않으면서 특정 단계에서 수행하는 내용을 바꾸는 패턴이다.
디자인 패턴이라고 하기도 뭐할정도로 객체지향 언어로 개발을 하다보면 무의식적으로 사용하는 패턴이다. 주로 개발을 하다보면 구체적인 구현은 다르지만 기본적인 기능은 비슷한 경우가 종종 있다. 예를 들면 HTTP와 SMTP Client 프로그램의 경우, 주고받는 메시지의 내용이 서로 다를 뿐 둘 다 인터넷 프로토콜을 이용하여 서버에게 요청을 전달하고 결과를 수신한다는 점에서 동일하다. 이처럼 두개 이상의 프로그램이 기본적으로 동일한 골격 하에서 동작할때 기본 골격에 해당하는 알고리즘은 일괄적으로 관리하면서 각 프로그램마다 달라지는 부분들에 대해서는 따로 만들고 싶을때 템플릿 메소드 패턴을 사용하면 좋다.
다른 관점에서 보면 동일한 기능을 상위 클래스에서 정의하면서 확장/변화가 필요한 부분만 서브 클래스에서 구현할 수 있도록 한다.
예를 들어, 전체적인 알고리즘은 상위 클래스에서 구현하면서 다른 부분은 하위 클래스에서 구현할 수 있도록 함으로써 전체적인 알고리즘 코드를 재사용하는 데 유용하도록 한다.
AbstractClass
템플릿 메서드를 정의하는 클래스
하위 클래스에 공통 알고리즘을 정의하고 하위 클래스에서 구현될 기능을 primitive 메서드 등으로 정의하는 클래스이다.
ConcreteClass
물려받은 primitive 메서드 또는 hook 메서드를 구현하는 클래스
상위 클래스에 구현된 템플릿 메서드의 일반적인 알고리즘에서 하위 클래스에 적합하게 primitive 메서드 등을 오버라이드 하는 클래스이다.
템플릿 메서드 패턴 예제
아이스 아메리카노와 아이스 라떼를 만드는 법을 비교해보자.
(지극히 제 생각으로 만드는 것이고 일반 카페에서 만드는 방법과 다를 수 있습니다.)
아이스 아메리카노 | 아이스 라떼 |
1. 물을 끓인다. 2. 끓는 물에 에스프레소를 넣는다. 3. 얼음을 넣는다. 4. 시럽을 넣는다. |
1. 물을 끓인다. 2. 끓는 물에 에스프레소를 넣는다 3. 얼음을 넣는다 4, 우유를 넣는다. |
이를 한번 코딩해보자.
package TemplateMethodPattern;
public class IceAmericano {
public void makeIceAmericano() {
boilWater();
putEspresso();
putIce();
putSyrup();
}
private void boilWater() {
System.out.println("물을 끓인다.");
}
private void putEspresso() {
System.out.println("끓는 물에 에스프레소를 넣는다.");
}
private void putIce() {
System.out.println("얼음을 넣는다.");
}
private void putSyrup() {
System.out.println("시럽을 넣는다.");
}
}
package TemplateMethodPattern;
public class IceLatte {
public void makeIceLatte() {
boilWater();
putEspresso();
putIce();
putMilk();
}
private void boilWater() {
System.out.println("물을 끓인다.");
}
private void putEspresso() {
System.out.println("끓는 물에 에스프레소를 넣는다.");
}
private void putIce() {
System.out.println("얼음을 넣는다.");
}
private void putMilk() {
System.out.println("우유를 넣는다.");
}
}
package TemplateMethodPattern;
public class MakeCoffeeMain {
public static void main(String[] args) {
IceAmericano americano = new IceAmericano();
IceLatte latte = new IceLatte();
americano.makeIceAmericano();
System.out.println("===");
latte.makeIceLatte();
}
}
물을 끓인다. 끓는 물에 에스프레소를 넣는다. 얼음을 넣는다. 시럽을 넣는다. === 물을 끓인다. 끓는 물에 에스프레소를 넣는다. 얼음을 넣는다. 우유를 넣는다. |
그런데 위의 코드는 중복되는 코드가 많다.
따라서 한번 추상화 시켜 클래스 다이어그램으로 나타내보자.
무언가 Coffee 클래스에 공통된 것을 두고, 상속을 통해 자식 클래스에서 마무리하면 될 것 같다.
하지만 여기서 makeCoffee를 한단계 더 추상화 할 수 있다
하지만 여기서 한단계 더 추상화 할 수 있다.
putSyrup, putMilk마저 putExtra로 추상화 하는 것이 템플릿 메소드 패턴의 목적이다.
템플릿 메소드 패턴 장단점
장점
1. 중복코드를 줄일 수 있다.
2. 자식 클래스의 역할을 줄여 핵심 로직의 관리가 용이하다.
3. 좀더 코드를 객체지향적으로 구성할 수 있다.
단점
1. 추상 메소드가 많아지면서 클래스 관리가 복잡해진다.
2. 클래스간의 관계와 코드가 꼬여버릴 염려가 있다.
Script
어떤 작업을 처리하는 일부분을 서브 클래스로 캡슐화해 전체 일을 수행하는 구조는 바꾸지 않으면서 특정 단계에서 수행하는 내역을 바꾸는 패턴
즉, 전체적으로는 동일하면서 부분적으로는 다른 구문으로 구성된 메서드의 코드 중복을 최소화 할 때 유용하다.
참고
https://www.inflearn.com/course/%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4
'디자인패턴' 카테고리의 다른 글
커맨드 패턴 (Command Pattern) (0) | 2022.10.08 |
---|---|
책임 연쇄 패턴(Chain of Responsibility Pattern) (0) | 2022.10.08 |
전략패턴(Strategy Pattern) (1) | 2022.09.20 |
플라이웨이턴 패턴 (Flyweight Pattern) (0) | 2022.08.15 |
퍼사드 패턴(Facade Pattern) (0) | 2022.08.14 |