템플릿 메소드는 행위 디자인 패턴입니다. 템플릿 메소드 디자인 패턴은 메소드 스텁을 생성하고 일부 구현 단계를 서브클래스에게 위임하는 데 사용됩니다.
템플릿 메소드 디자인 패턴
템플릿 메소드는 알고리즘을 실행하기 위한 단계를 정의하며, 모든 서브클래스 또는 일부 서브클래스에게 공통적으로 사용될 수 있는 기본 구현을 제공할 수 있습니다. 예를 들어, 집을 지을 알고리즘을 제공하고자 한다고 가정해보겠습니다. 집을 지을 때 수행해야 할 단계는 다음과 같습니다 – 기초를 세우기, 기둥을 세우기, 벽과 창문을 짓기. 중요한 점은 실행 순서를 변경할 수 없다는 것인데, 기초를 세우기 전에 창문을 짓을 수 없습니다. 그래서 이 경우 집을 지을 때 다른 메소드를 사용할 수 있는 템플릿 메소드를 생성할 수 있습니다. 이제 집을 짓기 위한 기초는 나무로 지은 집이든 유리로 지은 집이든 모두 동일합니다. 이에 따라 기본 구현을 제공할 수 있으며, 서브클래스가 이 메소드를 재정의하려면 재정의할 수 있지만, 대부분의 경우 모든 유형의 집에 대해 공통적입니다. 서브클래스가 템플릿 메소드를 재정의하지 못하도록 하기 위해 이 메소드를 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의 모든 비추상 메서드.
템플릿 메서드 디자인 패턴 중요한 포인트
- 템플릿 메서드는 순서가 고정된 특정 단계로 구성되어 있으며, 일부 메서드의 구현은 기본 클래스에서 하위 클래스로 다릅니다. 템플릿 메서드는 final이어야 합니다.
- 대부분의 경우, 하위 클래스는 슈퍼 클래스의 메소드를 호출하지만 템플릿 패턴에서는 슈퍼 클래스의 템플릿 메소드가 하위 클래스의 메소드를 호출합니다. 이것은 할리우드 원칙으로 알려져 있습니다 – “우리를 호출하지 마세요, 우리가 호출할게요.”
- 기본 구현이 있는 기본 클래스의 메소드를 훅이라고 하며, 하위 클래스에서 재정의할 수 있도록 의도되어 있습니다. 일부 메소드를 재정의하지 않으려면 해당 메소드를 final로 만들 수 있습니다. 예를 들어, 우리의 경우 buildFoundation() 메소드를 final로 만들 수 있습니다. 왜냐하면 하위 클래스에서 재정의하지 않기를 원하기 때문입니다.
자바에서의 템플릿 메소드 디자인 패턴에 대한 설명은 여기까지입니다. 좋아하셨기를 바랍니다.
Source:
https://www.digitalocean.com/community/tutorials/template-method-design-pattern-in-java