- Template Method 패턴 : 하위 클래스에서 구체적으로 처리한다
Template Method 패턴은 템플릿 기능을 가진 패턴으로, 상위 클래스에서 처리의 뼈대를 결정하고 하위 클래스에서 그 구체적인 내용을 결정하는 패턴이다. 상위 클래스의 코드로는 어떻게 처리되는지 알 수 없다.
- 어떤 경우에 사용할까?
Template Method 패턴을 사용하면, 상위 클래스에 알고리즘이 기술되어 있으므로 하위 클래스 쪽에는 알고리즘을 일일이 기술할 필요가 없어지고, 오류가 발견되더라도 Template Method만 수정하면 된다.
- 예제 코드
이름 | 설명 |
AbstractDisplay | 메서드 display만 구현된 추상 클래스 |
CharDisplay, StringDisplay | 메서드 open, print, close를 구현하는 클래스 |
Main | 동작 테스트용 클래스 |
- AbstractDisplay 클래스
public abstract class AbstractDisplay {
// open, print, close는 하위 클래스에 구현을 맡기는 추상 메소드
public abstract void open();
public abstract void print();
public abstract void close();
// display는 AbstractDisplay에서 구현하는 메소드
public final void display() {
open();
for(int i = 0 ; i < 5 ; i++) {
print();
}
close();
}
}
- CharDisplay 클래스
public class CharDisplay extends AbstractDisplay {
private char ch; // 표시해야 하는 문자
public CharDisplay(char ch) {
this.ch = ch;
}
@Override
public void open() {
// 시작 문자열 "<<"를 표시한다
System.out.print("<<");
}
@Override
public void print() {
// 필드에 저장해 둔 문자를 1회 표시한다
System.out.print(ch);
}
@Override
public void close() {
// 종료 문자열 ">>"를 표시한다
System.out.println(">>");
}
}
- StringDisplay 클래스
public class StringDisplay extends AbstractDisplay {
private String string; // 표시해야 하는 문자열
private int width; // 문자열의 길이
// 생성자
public StringDisplay(String string) {
this.string = string;
this.width = string.length();
}
@Override
public void open() {
printLine();
}
@Override
public void print() {
System.out.println("|" + string + "|");
}
@Override
public void close() {
printLine();
}
// open과 close에서 호출되어 "+----+" 문자열을 표시하는 메소드
private void printLine() {
System.out.print("+");
for(int i = 0 ; i < width ; i++) {
System.out.print("-");
}
System.out.println("+");
}
}
- Main 클래스
public class Main {
public static void main(String[] args) {
// 'H'를 가진 CharDisplay 인스턴스를 하나 만든다
AbstractDisplay d1 = new CharDisplay('H');
// "Hello, world."를 가진 StringDisplay 인스턴스를 하나 만든다
AbstractDisplay d2 = new StringDisplay("Hello, world.");
// d1, d2 모두 같은 AbstractDisplay의 하위 클래스의 인스턴스이므로
// 상속한 display 메소드를 호출할 수 있다
// 실제 동작은 CharDisplay나 StringDisplay 클래스에서 정해진다
d1.display();
d2.display();
}
}
참고문헌 : 유키 히로시 저/김성훈 역(2022), JAVA 언어로 배우는 디자인 패턴 입문, 영진닷컴
참고자료 : https://refactoring.guru/ko/design-patterns/template-method