Template Method
- 템플릿 메서드 패턴 : 특정 작업을 서브 클래스로 캡슐화하는데, 전체 수행 구조는 바뀌지 않으면서
특정 단계에서 수행하는 내역을 바꾸는 패턴
* 호출되는 메서드는 동일하지만, 세부적으로 호출되는 메서드를 로직을 다르게 작성함으로 코드 중복을 최소화한다!
* 되게 용어가 복잡하고, 정신없지만 밑에서 정리해드리겠습니다.
Why Template Method?
- Template Method는 전체적인 로직을 가지고 있지만, 세부 메서드를 추상화하여 상세 로직을 유연하게 바꾸는 방식!
- 따라서, 전체 흐름은 동일하게 가고 세부를 변경(코드의 중복 최소화)하는 것이 핵심이다!
* 그렇게 되면, 코드의 재사용성을 높이고, 중복을 최소화하여, 객체에 따라서 논리적인 흐름을 변경하는 것이 가능하다!
직접 구현
우선, Method의 이름을 먼저 정리해드리겠습니다!
- Template Method : 전체적인 로직이 흐르게 되는 메서드, 추상화된 메서드와 Hook 메서드를 포함할 수 있다!
- Abstract Method : Template Method에 있는 추상화된 메서드, 세부 로직이 담긴 메서드다
- Hook Method : 일반 메서드인데, 객체에 따라서 Override를 해도 되고 안해도 되는 메서드!
* 바로 코드를 통해서 알아보자
package templatemethod;
public abstract class Person {
// Template Method
public void readyToTrip() {
makeUp();
dressUp();
System.out.println("ready : 밖으로 나가자!");
System.out.println("ready : 여행 준비가 끝났어!!");
}
// Hook Method
void dressUp() {
System.out.println("dressUp : 속옷을 입자!");
}
// abstract Method
protected abstract void makeUp();
}
1. 추상화된 Person Class
* readyToTrip 메서드는 사람들이 여행 준비를 하는 로직을 나타내는 메서드다!
* dressUp 메서드는 Hook Method로 Override를 해도 되고, 안해도 된다!
* makeUp 메서드는 사람에 따라서 준비과정이 다르므로 추상화를 한다!
package templatemethod;
public class Boy extends Person {
@Override
protected void makeUp() {
System.out.println("makeUp : 씻고, 옷입고, 거울 보고 끝!");
}
@Override
void dressUp() {
super.dressUp();
System.out.println("dressUp : 반팔, 긴바지, 시계를 차자!");
}
}
2. Person을 상속받은 Boy Class
* 남자들은 메이크업이 정말 단순하다..!
* 옷을 입는 것도 정말 단순하다...ㅎ
package templatemethod;
public class Girl extends Person {
@Override
protected void makeUp() {
System.out.println("makeUp : 씻고, 화장을 하자!");
System.out.println("makeUp : 머리 말리는데 왜 이렇게 오래 걸리니ㅠㅠ");
}
@Override
void dressUp() {
super.dressUp();
System.out.println("dressUp : 치마를 입고, 블라우스를 입자!");
System.out.println("dressUp : 머리 점검, 화장 점검, 신발은 어떤거 신지?");
}
}
3. Person을 상속받은 Girl Class
* 여자들은 대게 준비할 것이 많다!
* 옷, 화장, 신발 등등등 남자보다는 많이 준비한다!
Test Code
package templatemethod;
import org.junit.jupiter.api.Test;
class PersonTest {
@Test
void 소년과_소녀가_제대로_나갈준비하는지_알아보자() {
/* Given */
Person boy = new Boy();
Person girl = new Girl();
/* Then */
boy.readyToTrip();
System.out.println("---------");
girl.readyToTrip();
}
}
* Boy와 Girl 이 각자 여행준비를 하고 있다! 어떻게 될까?
정리
- Template Method Pattern은 전체 로직을 동일하게 갖고, 세부 로직을 변경하는 디자인 패턴이다!
- 코드의 재사용성, 유지보수, 중복 최소화를 통해서 Clean Code로 깔끔하게 작성할 수 있다!
- 중복되는 로직과 표현들이 있다면, Abstract Class로 묶어보자! 많이 도움이 될 것이다!
참고
[Design Pattern] 템플릿 메서드 패턴이란
'Developer > Design Pattern' 카테고리의 다른 글
Factory Method Pattern - 팩토리 메서드 (0) | 2019.06.21 |
---|---|
Abstract Factory Pattern - 추상팩토리 패턴 (0) | 2019.06.18 |
Observer Pattern - 옵저버 패턴 (0) | 2019.06.09 |
Visitor Pattern - 비지터 패턴, 방문자 패턴 (2) | 2019.05.26 |
Strategy Pattern - 스트레지 패턴, 전략 (0) | 2019.05.26 |