Design Pattern

디자인 패턴 - 행위(Behavioral)패턴 - Template

간카레 2024. 10. 10. 14:03
반응형
SMALL

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

위 유튜브 강의를 듣고 작성하였다.

반응형
LIST