자바에서의 템플릿 메서드 디자인 패턴

템플릿 메소드는 행위 디자인 패턴입니다. 템플릿 메소드 디자인 패턴은 메소드 스텁을 생성하고 일부 구현 단계를 서브클래스에게 위임하는 데 사용됩니다.

템플릿 메소드 디자인 패턴

템플릿 메소드는 알고리즘을 실행하기 위한 단계를 정의하며, 모든 서브클래스 또는 일부 서브클래스에게 공통적으로 사용될 수 있는 기본 구현을 제공할 수 있습니다. 예를 들어, 집을 지을 알고리즘을 제공하고자 한다고 가정해보겠습니다. 집을 지을 때 수행해야 할 단계는 다음과 같습니다 – 기초를 세우기, 기둥을 세우기, 벽과 창문을 짓기. 중요한 점은 실행 순서를 변경할 수 없다는 것인데, 기초를 세우기 전에 창문을 짓을 수 없습니다. 그래서 이 경우 집을 지을 때 다른 메소드를 사용할 수 있는 템플릿 메소드를 생성할 수 있습니다. 이제 집을 짓기 위한 기초는 나무로 지은 집이든 유리로 지은 집이든 모두 동일합니다. 이에 따라 기본 구현을 제공할 수 있으며, 서브클래스가 이 메소드를 재정의하려면 재정의할 수 있지만, 대부분의 경우 모든 유형의 집에 대해 공통적입니다. 서브클래스가 템플릿 메소드를 재정의하지 못하도록 하기 위해 이 메소드를 final로 만들어야 합니다.

템플릿 메소드 추상 클래스

일부 메소드를 서브 클래스에서 구현하려면 기본 클래스를 추상 클래스로 만들어야 합니다. HouseTemplate.java

package com.journaldev.design.template;

public abstract class HouseTemplate {

	//템플릿 메소드, 서브 클래스에서 오버라이드할 수 없도록 final
	public final void buildHouse(){
		buildFoundation();
		buildPillars();
		buildWalls();
		buildWindows();
		System.out.println("House is built.");
	}

	//기본 구현
	private void buildWindows() {
		System.out.println("Building Glass Windows");
	}

	//서브 클래스에서 구현할 메소드
	public abstract void buildWalls();
	public abstract void buildPillars();

	private void buildFoundation() {
		System.out.println("Building foundation with cement,iron rods and sand");
	}
}

buildHouse()는 템플릿 메소드로, 여러 단계를 수행하는 순서를 정의합니다.

템플릿 메소드 구체 클래스

우리는 나무 집과 유리 집과 같은 다른 유형의 집을 가질 수 있습니다. WoodenHouse.java

package com.journaldev.design.template;

public class WoodenHouse extends HouseTemplate {

	@Override
	public void buildWalls() {
		System.out.println("Building Wooden Walls");
	}

	@Override
	public void buildPillars() {
		System.out.println("Building Pillars with Wood coating");
	}

}

다른 메소드도 오버라이드 할 수 있지만, 간단함을 위해 생략합니다. GlassHouse.java

package com.journaldev.design.template;

public class GlassHouse extends HouseTemplate {

	@Override
	public void buildWalls() {
		System.out.println("Building Glass Walls");
	}

	@Override
	public void buildPillars() {
		System.out.println("Building Pillars with glass coating");
	}

}

템플릿 메소드 패턴 클라이언트

테스트 프로그램으로 템플릿 메소드 패턴 예제를 테스트해 봅시다. HousingClient.java

package com.journaldev.design.template;

public class HousingClient {

	public static void main(String[] args) {
		
		HouseTemplate houseType = new WoodenHouse();
		
		//템플릿 메소드 사용
		houseType.buildHouse();
		System.out.println("************");
		
		houseType = new GlassHouse();
		
		houseType.buildHouse();
	}

}

클라이언트가 기본 클래스의 템플릿 메서드를 호출하고, 다른 단계의 구현에 따라 기본 클래스와 하위 클래스의 메서드를 사용합니다. 위 프로그램의 출력은 다음과 같습니다:

Building foundation with cement,iron rods and sand
Building Pillars with Wood coating
Building Wooden Walls
Building Glass Windows
House is built.
************
Building foundation with cement,iron rods and sand
Building Pillars with glass coating
Building Glass Walls
Building Glass Windows
House is built.

템플릿 메서드 클래스 다이어그램

JDK에서의 템플릿 메서드 디자인 패턴

  • java.io.InputStream, java.io.OutputStream, java.io.Reader 및 java.io.Writer의 모든 비추상 메서드.
  • java.util.AbstractList, java.util.AbstractSet 및 java.util.AbstractMap의 모든 비추상 메서드.

템플릿 메서드 디자인 패턴 중요한 포인트

  1. 템플릿 메서드는 순서가 고정된 특정 단계로 구성되어 있으며, 일부 메서드의 구현은 기본 클래스에서 하위 클래스로 다릅니다. 템플릿 메서드는 final이어야 합니다.
  2. 대부분의 경우, 하위 클래스는 슈퍼 클래스의 메소드를 호출하지만 템플릿 패턴에서는 슈퍼 클래스의 템플릿 메소드가 하위 클래스의 메소드를 호출합니다. 이것은 할리우드 원칙으로 알려져 있습니다 – “우리를 호출하지 마세요, 우리가 호출할게요.”
  3. 기본 구현이 있는 기본 클래스의 메소드를 이라고 하며, 하위 클래스에서 재정의할 수 있도록 의도되어 있습니다. 일부 메소드를 재정의하지 않으려면 해당 메소드를 final로 만들 수 있습니다. 예를 들어, 우리의 경우 buildFoundation() 메소드를 final로 만들 수 있습니다. 왜냐하면 하위 클래스에서 재정의하지 않기를 원하기 때문입니다.

자바에서의 템플릿 메소드 디자인 패턴에 대한 설명은 여기까지입니다. 좋아하셨기를 바랍니다.

Source:
https://www.digitalocean.com/community/tutorials/template-method-design-pattern-in-java