티스토리 뷰
템플릿이란 문자 모양으로 구멍이 뚫려있는 얇은 플라스틱 판을 말한다.
그 구멍을 따라 펜으로 그리면 손으로도 반듯한 문자를 쓸 수 있다.
템플릿의 구멍을 보면 어떤 모양의 문자인지는 알 수 있지만, 실제로 어떤 문자가 될지는 필기구에 의해 결정된다.
템플릿 메서드 패턴이란
이 패턴은 템플릿의 기능을 가진 패턴이다.
상위 클래스쪽에 해당하는 메소드가 정의되어 있고, 그 메서드의 정의 안에는 추상 메서드가 사용되고 있다.
따라서 상위 클래스의 프로그램만 보면 추상 메서드를 어떻게 호출하고 있는지 알 수 있지만, 최종적으로 어떤 처리가 수행되는지는 알 수 없다.
추상 메서드를 실제로 구현하는 것은 하위 클래스이다.
하위 클래스 측에서 메서드를 구현하면 구체적인 처리가 결정된다.
서로 다른 하위 클래스가 서로 다른 구현을 실행하면 서로 다른 처리가 실행될 것이다.
그러나 어떤 하위 클래스에서 어떤 구현을 하더라도 처리의 큰 흐름은 상위 클래스에서 결정한대로 이루어진다.
이와 같이 상위 클래스에서 처리의 뼈대를 결정하고, 하위 클래스에서 그 구체적인 내용을 결정하는 디자인 패턴이다.
문자나 문자열을 5회 반복해서 표시하는 예제 코드
- AbstractDisplay 클래스 : disyplay() 만 구현되고 있는 추상 클래스
- CharDisplay 클래스 : open(), print(), close()를 구현하고 있는 클래스
- StringDisplay 클래스 : open(), print(), close()를 구현하고 있는 클래스
- Main 클래스
AbstractDisplay 클래스
open(), print(), close(), display() 메서드를 가진다.
display() 만이 구현되어 있고 나머지 메서드는 추상 메서드다.
실제로 메서드가 무엇을 하고 있는가는 추상 메서드를 구현하는 하위 클래스에게 맡긴다.
CharDisplay 클래스
- open() : 문자열 “<<”을 표시한다.
- print() : 생성자에서 주어진 문자를 표시한다.
- close() : 문자열 “>>”을 표시한다.
StringDisplay 클래스
- open() : 문자열 “+———+”을 표시한다.
- print() : 생성자에서 주어진 문자열을 “|”와 “|” 사이에 표시한다.
- close() : 문자열 “+———+”을 표시한다.
Main 클래스
위 두 클래스의 인스턴스를 만들어 display 메서드를 호출한다.
public class Main {
public static void main(String[] args) {
AbstractDisplay d1 = new CharDisplay('H');
AbstractDisplay d2 = new StringDisplay("Hello World");
AbstractDisplay d3 = new StringDisplay("안녕하세요.");
d1.display();
d2.display();
d3.display();
}
}
Template Method 패턴의 핵심 키워드
예제 코드와 동작을 살펴봤으니 이젠 핵심 키워드를 살펴보자.
AbstractClass(추상 클래스)의 역할 - AbstractDisplay
템플릿 메소드를 구현, 템플릿 메서드에서 사용하고 있는 추상 메서드 선언 역할을 한다.
ConcreteClass(구현 클래스)의 역할 - Char(String)Display
추상 클래스에서 정의되어 있는 추상 메서드를 구현하는 역할을 한다.
🤔 이 패턴을 사용하면 어떤 이점이 있을까?
로직을 공통화할 수 있다.
상위 클래스의 템플릿 메서드에서 알고리즘이 기술되어 있으므로, 하위 클래스측에서는 알고리즘을 일일이 기술할 필요가 없다.
상위 클래스에서 선언된 추상 메서드를 실제로 하위 클래스에서 구현할 때에는 그 메서드가 어느 타이밍에서 호출되는지 이해해야 한다.
상위 클래스의 소스 프로그램이 없으면 하위 클래스의 구현이 어려울 수 있다.
하위 클래스를 상위 클래스와 동일시하는 것이 좋다.
이건 바로 SOLID 원칙 중 LSP에 해당한다.
💡 상위 클래스형의 변수에 하위 클래스의 어떠한 인스턴스를 대입해도 제대로 작동할 수 있도록 한다.
관련 패턴
- Factory Method 패턴
- Strategy 패턴
'JAVA > 디자인 패턴' 카테고리의 다른 글
싱글톤(Singleton) 패턴 (0) | 2022.03.11 |
---|---|
Factory Method 패턴 (0) | 2022.03.11 |
어댑터 패턴 (0) | 2022.03.09 |
Iterator 패턴 (0) | 2022.03.08 |
널(Null) 객체 패턴 (0) | 2022.03.07 |
- Total
- Today
- Yesterday
- kotest
- 백준
- 클린 코드
- 클린 아키텍처
- 이펙티브 자바
- 이팩티브 자바
- Olympiad
- Spring
- Effective Java
- 디자인패턴
- C++
- 정규표현식
- AWS
- Kotlin
- JPA
- 객체지향
- Algorithm
- 알고리즘
- Java
- 프로그래머스
- 코테
- programmers
- kkoon9
- node.js
- BAEKJOON
- 디자인 패턴
- Spring Boot
- 테라폼
- MSA
- BOJ
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |