Template 패턴은
상위 클래스에서는 알고리즘의 뼈대를 정의하고 구체적인 단계는 하위 클래스에서 정의하는 패턴이라고 한다.
알고리즘의 구조를 변경하지 않고 알고리즘의 특정 단계들을 재정의할 수 있다고 한다.
미리 선언해놓은 Article에서는 구체적인 코드없이 순서(단계)적으로 실행만하고,
하위 Article에서 구체적인 코드를 구현하여
필요에 따라 다른 동작을 하도록 구조를 잡는 것 같다.
먼저 Aticle class는
실제 데이터를 얻는 class이다.
아래 코드에서는 제목, 내용, 밑바탕 글을 얻을 수 있다.
package Template;
import java.util.ArrayList;
public class Article {
private String title;
private ArrayList<String> content;
private String footer;
public Article(String title, ArrayList<String> content, String footer) {
this.title = title;
this.content = content;
this.footer = footer;
}
public String getTitle() {
return title;
}
public ArrayList<String> getContent() {
return content;
}
public String getFooter() {
return footer;
}
}
다음은 각 단계를 정해진 순서대로 실행하는 DisplayArticleTemplate 추상클래스이다.
package Template;
public abstract class DisplayArticleTemplate {
protected Article article;
public DisplayArticleTemplate(Article article) {
this.article = article;
}
public final void display() {
title();
content();
footer();
}
protected abstract void title();
protected abstract void content();
protected abstract void footer();
}
이제 첫 번째로 실행할 수 있는 SimpleDisplayArticle 클래스를 구현한다.
추상클래스인 DisplayArticleTemplate를 상속 받는다.
생성자를 통해 Article을 전달받아 초기화하고,
SimpleDisplayArticle의 추상메소드들을 구현한다.
package Template;
import java.util.ArrayList;
public class SimpleDisplayArticle extends DisplayArticleTemplate {
public SimpleDisplayArticle(Article article) {
super(article);
}
@Override
protected void title() {
System.out.println(article.getTitle());
}
@Override
protected void content() {
ArrayList<String> content = article.getContent();
int cntLines = content.size();
for(int i=0; i<cntLines; i++) {
System.out.println(content.get(i));
}
}
@Override
protected void footer() {
System.out.println(article.getFooter());
}
}
두번째로 실행할 수 있는 CaptionDisplayArticle 클래스를 구현한다.
동일하게 DisplaryArticleTemplate을 상속 받는다.
package Template;
import java.util.ArrayList;
public class CaptionDisplayArticle extends DisplayArticleTemplate {
public CaptionDisplayArticle(Article article) {
super(article);
}
@Override
protected void title() {
System.out.println("TITLE: " + article.getTitle());
}
@Override
protected void content() {
System.out.println("CONTENT: ");
ArrayList<String> content = article.getContent();
int cntLines = content.size();
for(int i=0; i<cntLines; i++) {
System.out.println(" " + content.get(i));
}
}
@Override
protected void footer() {
System.out.println("FOOTER: "+article.getFooter());
}
}
이제 메인 메소드를 구현한다.
Article에 넣을 데이터를 정의한다.
정의한 데이터를 넣어 Article 인스턴스를 생성한다.
DisplayArticleTemplate을 이용하여
SimpleDisplayArticle과 CaptionDisplayArticle을 사용할 수 있다.
이렇게 메인메소드에서 알고리즘의 구조를 직접 변경하지 않고,
DisplaryArticleTemplate를 사용하여, 동일한 사용법으로 2가지 케이스의 결과를 출력할 수 있다.
import java.util.ArrayList;
import Template.Article;
import Template.CaptionDisplayArticle;
import Template.DisplayArticleTemplate;
import Template.SimpleDisplayArticle;
public class MainEntry {
public static void main(String[] args) {
String title = "디자인패턴";
ArrayList<String> content = new ArrayList<String>();
content.add("디자인패턴은 클래스 간의 효율적이고 최적화된 관계를 설계하는 것입니다.");
content.add("각 패턴을 외우기 보다 이해하는 것이 중요합니다.");
content.add("다양한 패턴을 접하고 반복적으로 이해할수록");
content.add("각 디자인패턴에 대한 응용의 폭이 넓어질 것입니다.");
String footer = "2022.1.9, GIS Developer 김형준";
Article article = new Article(title, content, footer);
System.out.println("[CASE-1]");
DisplayArticleTemplate style1 = new SimpleDisplayArticle(article);
style1.display();
System.out.println();
System.out.println("[CASE-2]");
DisplayArticleTemplate style2 = new CaptionDisplayArticle(article);
style2.display();
}
}
지금까지 어떤 기능에 대해서 실행되어야할 각 단계는 정해져있으나
각 단계에 대한 세부 구현을 상황에 맞게 다르게 구현할 수 있도록 하는 템플릿 패턴에 대해서 살펴보았다.
이 글은
https://www.youtube.com/watch?v=hPTqWJm51Vs&list=PLe6NQuuFBu7FhPfxkjDd2cWnTy2y_w_jZ&index=4
위 유튜브 강의를 듣고 작성하였다.