Java/Design Pattern

[Design Pattern] Template Method Pattern(템플릿 메소드 패턴)이란

SeungbeomKim 2023. 11. 6. 18:02

템플릿 메소드 패턴이란 알고리즘의 구조를 메소드에 정의하고, 하위 클래스에서 알고리즘 구조의 변경 없이 알고리즘을 재정의 하는 패턴입니다.

 

알고리즘이 단계별로 나누어지거나, 같은 역할을 하는 메소드지만 여러 곳에서 다른 형태로 사용이 필요한 경우 유용한 패턴입니다.

 

토비의 스프링에서는 다음과 같이 정의합니다.

  • 상속을 통해 슈퍼클래스의 기능을 확장할 때 사용하는 가장 대표적인 방법. 변하지 않는 기능은 슈퍼클래스에 만들어 두고 자주 변경되며 확장할 기능은 서브클래스에 만들도록 한다.

 

Template-Method-Pattern-Image

조건

  1. 클래스는 추상(abstract) 클래스로 만들어야 됩니다.
  2. 단계를 진행하는 메소드는 수정이 불가능하도록 final 키워드를 추가합니다.
  3. 각 단계에서 외부는 막고, 자식들만 활용할 수 있도록 protected로 선언합니다.
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 abstract class DisplayArticleTemplate {
	
    protected Article article; // 파생 클래스에서 접근할 수 있도록 protected 접근 제어자 지정
    
    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();
}
public class SimpleDisyplayArticle extends DisplayArticleTemplate {
	
    public SimpleDisplayArticle(Article article) {
    	super(article)
    }
    
    @Override
    protected void title() {
       .. 메소드 구현
    }
    
    @Override
    protected void content() {
       .. 메소드 구현
    }
    
    @Override
    protected void footer() {
       .. 메소드 구현
    }
}

public class CaptionDisyplayArticle extends DisplayArticleTemplate {
	
    public CaptionDisplayArticle(Article article) {
    	super(article)
    }
    
    @Override
    protected void title() {
       .. 메소드 구현
    }
    
    @Override
    protected void content() {
       .. 메소드 구현
    }
    
    @Override
    protected void footer() {
       .. 메소드 구현
    }
}

main

...

DisplayArticleTemplate style1 = new SimpleDisplayArticle(article);
style1.display();

DisplayArticleTemplate style2 = new CaptionDisplayArticle(article);
style2.display();

 

어떤 기능에 대해서 실행되어야 할 각 단계는 정해져 있고, 각 단계에 대한 세부 구현을 상황에 맞게 다르게 구현할 수 있게 되었습니다.