웹사이트 검색

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


템플릿 방식은 동작 디자인 패턴입니다. 템플릿 메서드 디자인 패턴은 메서드 스텁을 만들고 일부 구현 단계를 하위 클래스로 연기하는 데 사용됩니다.

템플릿 방식 디자인 패턴

템플릿 메서드는 알고리즘을 실행하는 단계를 정의하고 모든 하위 클래스 또는 일부 하위 클래스에 공통일 수 있는 기본 구현을 제공할 수 있습니다. 예를 들어 이 패턴을 이해해 봅시다. 집을 짓는 알고리즘을 제공하고 싶다고 가정해 보겠습니다. 집을 짓기 위해 수행해야 하는 단계는 건물 기초, 건물 기둥, 건물 벽 및 창입니다. 중요한 점은 기반을 구축하기 전에 창을 구축할 수 없기 때문에 실행 순서를 변경할 수 없다는 것입니다. 따라서 이 경우 집을 짓는 데 다른 방법을 사용하는 템플릿 방법을 만들 수 있습니다. 이제 집의 기초를 쌓는 것은 목조 주택이든 유리 주택이든 모든 유형의 주택에서 동일합니다. 따라서 이에 대한 기본 구현을 제공할 수 있습니다. 하위 클래스가 이 메서드를 재정의하려는 경우 대부분 모든 유형의 주택에 공통적입니다. 하위 클래스가 템플릿 메서드를 재정의하지 않도록 하려면 최종 메서드로 만들어야 합니다.

템플릿 메서드 추상 클래스

일부 메소드가 서브클래스에 의해 구현되기를 원하므로 기본 클래스를 추상 클래스로 만들어야 합니다. HouseTemplate.java

package com.journaldev.design.template;

public abstract class HouseTemplate {

	//template method, final so subclasses can't override
	public final void buildHouse(){
		buildFoundation();
		buildPillars();
		buildWalls();
		buildWindows();
		System.out.println("House is built.");
	}

	//default implementation
	private void buildWindows() {
		System.out.println("Building Glass Windows");
	}

	//methods to be implemented by subclasses
	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();
		
		//using template method
		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. 템플릿 메서드는 순서가 고정된 특정 단계로 구성되어야 하며 일부 메서드의 경우 기본 클래스마다 구현이 다릅니다. 템플릿 방법은 최종적이어야 합니다.
  2. 대부분의 경우 하위 클래스는 상위 클래스의 메서드를 호출하지만 템플릿 패턴에서는 상위 클래스 템플릿 메서드가 하위 클래스의 메서드를 호출합니다. 이를 할리우드 원칙(\전화하지 마세요. 전화드리겠습니다.\)이라고 합니다.
  3. 기본 구현이 있는 기본 클래스의 메서드는 후크라고 하며 하위 클래스에 의해 재정의되도록 의도되었습니다. 일부 메서드를 재정의하지 않으려면 메서드를 최종으로 만들 수 있습니다. 예를 들어 우리의 경우 만들 수 있습니다. buildFoundation() 메서드는 하위 클래스가 재정의하는 것을 원하지 않기 때문에 최종 메서드입니다.

이것이 자바의 템플릿 메서드 디자인 패턴에 대한 전부입니다. 마음에 드셨기를 바랍니다.