템플릿 패턴을 사용하면 상위 클래스의 템플릿 메소드에 알고리즘이 기술되어 있어 하위 클래스 쪽에는 알고리즘을 일일이 기술할 필요가 없어진다.
추상클래스를 사용하는 이유는 무엇일까?
인스턴스화 할 수 도 없고 메소드 내부를 정의하지 않은 클래스인데 말이다.
템플릿 패턴을 통해 불필요한 반복을 줄이고 쉽게 개발 할 수 있도록 도와주는 템플릿 패턴이 있을 수 있는 것은 추상 클래스 덕분이다.
public abstract class AbstractDisplay {
public abstract void open();
public abstract void print();
public abstract void close();
//추상 메소드의 순서를 이용해 템플릿을 만듦
public final void display() {
open();
for(int i = 0; i< 5; i++){
print();
}
close();
}
}
public class StringDisplay extends AbstractDisplay {
private final String str;
private final int width;
public StringDisplay(String str) {
this.str = str;
this.width = str.length();
}
@Override
public void open() {
printLine();
}
@Override
public void print() {
System.out.println("|" + str + "|");
}
@Override
public void close() {
printLine();
}
private void printLine(){
System.out.print("+");
for(int i = 0; i < width; i++){
System.out.print("-");
}
System.out.println("+");
}
}
사용클래스에서는 추상메서드를 정의만 하면된다.
이미 템플릿이 정의되어 있기 때문이다. 확장성에 좋은 코드가 만들어지는 것이다.
public class CharDisplay extends AbstractDisplay {
private final char ch;
public CharDisplay(char ch) {
this.ch = ch;
}
@Override
public void open() {
System.out.print("<<");
}
@Override
public void print() {
System.out.print(ch);
}
@Override
public void close() {
System.out.print(">>");
}
}
charDisplay
클래스도 메서드의 역할만 정의했고 비즈니스 로직은 상위클래스에 정의되어 있다.