Template Method Pattern

Park Young Jun

 

Github : https://github.com/june0313

Y3S Study group : https://github.com/y3s-study

 

2018.08.24

Template?

틀, 형판, 양식

Template?

PPT template

Template?

Template engine(JSP, Handlebars, Thymeleaf, ...)

<div class="entry">
  <h1>{{title}}</h1>
  <div class="body">
    {{body}}
  </div>
</div>
{
  title: "AAA",
  body: "AAA"
}
{
  title: "BBB",
  body: "BBB"
}
<div class="entry">
  <h1>AAA</h1>
  <div class="body">
    AAA
  </div>
</div>
<div class="entry">
  <h1>BBB</h1>
  <div class="body">
    BBB
  </div>
</div>

template

model

Template Method Pattern

  • 상속을 사용하여 공통 코드를 재사용
  • 상위 클래스에서 전체적인 틀을 구현하고, 달라지는 부분은 각각의 하위클래스가 구현

Example

public class Programmer {
	public void work() {
		goToOffice();
		doWork();
		goToHome();
	}

	private void goToOffice() {
		System.out.println("출근");
	}

	private void doWork() {
		System.out.println("코딩");
	}

	private void goToHome() {
		System.out.println("퇴근");
	}
}
public class Designer {
	public void work() {
		goToOffice();
		doWork();
		goToHome();
	}

	private void goToOffice() {
		System.out.println("출근");
	}

	private void doWork() {
		System.out.println("디자인");
	}

	private void goToHome() {
		System.out.println("퇴근");
	}
}

Programmer.java

Designer.java

Example

public static void main(String[] args) {
	Programmer programmer = new Programmer();
	programmer.work();
	System.out.println("----------");
	Designer designer = new Designer();
	designer.work();
}
출근
코딩
퇴근
----------
출근
디자인
퇴근

main method

result

Template Method Pattern

Template Method Pattern

public abstract class Worker {
	public void work() {
		goToOffice();
		doWork();
		goToHome();
	}

	protected abstract void doWork();

	private void goToOffice() {
		System.out.println("출근");
	}

	private void goToHome() {
		System.out.println("퇴근");
	}
}

Worker.java

  • Abstract Class로 정의
  • 변하는 부분을 abstract method로 선언 : 하위클래스에서 반드시 구현하도록 강제함

Template Method Pattern

public class Programmer extends Worker {
	@Override
	protected void doWork() {
		System.out.println("코딩");
	}
}

Programmer.java

public class Designer extends Worker {
	@Override
	protected void doWork() {
		System.out.println("디자인");
	}
}

Designer.java

공통 로직은 상위 클래스인 Worker 클래스에서 처리하고 변하는 부분에 해당하는 doWork() 메서드를 오버라이딩

Template Method Pattern

public static void main(String[] args) {
        Worker worker = new Programmer();
	worker.work();
	System.out.println("----------");
	worker = new Designer();
	worker.work();
}
출근
코딩
퇴근
----------
출근
디자인
퇴근

main method

result

Template Method Pattern

public abstract class Worker {
	public void work() {
		goToOffice();
		doWork();
		goToHome();
	}

	protected abstract void doWork();
}
Template method 공통 로직이 포함되어 있으며 추상 메서드를 호출하는 메서드 work()
Hook method (Primitive method) 하위 클래스에서 오버라이드 해야하는 메서드 doWork()

Example on Servlet API

public class TestServlet extends HttpServlet {
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
		System.out.println("GET");
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) {
		System.out.println("POST");
	}
}
  • 서블릿 프로그래밍을 할 때 HttpServlet을 상속받아 doGet(), doPost() 메소드를 구현
  • doGet(), doPost() 메서드는 Hook method

Example on Servlet API

public abstract class HttpServlet extends GenericServlet {
    // ...
    
    // template에 해당하는 service() 메서드
    protected void service(HttpServletRequest req, HttpServletResponse resp) {
        if (method.equals(METHOD_GET)) {
            // ...
            doGet(req, resp);
        } else if (method.equals(METHOD_POST)) {
            // ...
            doPost(req, resp);  
        } else {
            // ...
        }
    }
}
  • HttpServlet의 service() 메서드가 template 역할을 수행
  • 하위 클래스에서 오버라이드한 doGet(), doPost()를 호출한다 

Pros & Cons

  • 템플릿 메서드 패턴은 전체적인 레이아웃을 통일시키고 하위 클래스를 통해 유연성 제공
  • 전체적인 알고리즘 코드를 재사용 하는 데 유용한 패턴
  • 하위 클래스의 책임이 줄어들면서 핵심 로직 구현에 집중가능

 

Pros

  • 구현해야 하는 abstract method(hook method)가 너무 많아지면 관리가 힘듬
  • 상속을 통해 구현되므로 다른 클래스를 상속받을 수 없다(Java 기준)

Cons

Summary

  • 템플릿 메서드 패턴은 전체적으로는 동일하면서 부분적으로 다른 구문으로 구성된 메서드의 코드 중복을 최소화할 때 유용하다.
  • 동일한 기능을 상위 클래스에서 정의하면서 확장/변화가 필요한 부분만 서브클래스에서 구현할 수 있도록 한다.
  • 전략패턴과 유사하다.

Thank You!

Template method pattern

By Young Jun Park (박영준)

Template method pattern

Template method pattern에 대해 소개합니다.

  • 194