GoF(Gang of Four) 디자인 패턴 중 하나인 Template Method 패턴은, 알고리즘의 구조를 정의하고, 일부 단계를 서브클래스에서 구현할 수 있도록 하는 행위 패턴입니다.
Template Method 패턴은 추상 클래스에 기본적인 알고리즘의 뼈대를 정의하고, 서브클래스에서 이 뼈대를 따라가면서 필요한 단계를 구현하도록 합니다. 즉, 알고리즘의 전체 구조는 추상 클래스에서 정의하고, 각 단계의 구체적인 구현은 서브클래스에서 정의합니다.
이 패턴을 사용하면, 코드의 중복을 줄일 수 있으며, 코드의 유연성을 높일 수 있습니다. 또한, 추상 클래스를 사용하여 알고리즘의 뼈대를 정의하므로, 알고리즘의 구조가 변경되어도 서브클래스에서 구현하는 단계만 변경하면 되므로, 유지보수성이 높아집니다.
예를 들어, 파일 입출력을 하는 프로그램을 작성한다고 가정해보겠습니다. 이때, 파일 입출력의 구조는 모두 같지만, 파일을 읽고 쓰는 방법은 파일의 종류나 용도에 따라 달라질 수 있습니다. 이런 경우, 파일 입출력의 구조를 추상 클래스로 정의하고, 각 파일 종류에 따른 구체적인 구현을 서브클래스에서 정의하는 것이 좋습니다. 이렇게 하면, 파일 입출력의 구조를 한번에 변경할 수 있으며, 각 파일 종류별로 구현이 달라져도 코드 중복을 줄일 수 있습니다.
Defines the skeleton of an algorithm in a method, deferring some steps to subclasses. Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithms structure. – GoF Design Patterns
상속을 통해 슈퍼클래스의 기능을 확장할 때 사용하는 가장 대표적인 방법. 변하지 않는 기능은 슈퍼클래스에 만들어두고 자주 변경되며 확장할 기능은 서브클래스에서 만들도록 한다. – 토비의 스프링 3.1
Template Method 패턴은 추상화된 알고리즘을 가지고 있는 클래스에서 일부 단계들을 구체화된 서브클래스로 위임하는 패턴입니다.
일반적으로, 알고리즘의 구조는 고정되어 있으며, 각 단계의 구현은 서브클래스에서 달라질 수 있습니다.
Template Method 패턴은 abstract class를 사용하여 구현합니다.
abstract class는 공통적인 알고리즘을 갖는 메소드를 제공하며, 서브클래스에서 이 메소드를 오버라이드하여 단계별로 알고리즘을 구현할 수 있습니다.
아래는 템플릿 메서드 패턴을 구현한 예제입니다.
두번째 예제
public abstract class Game {
abstract void initialize();
abstract void startPlay();
abstract void endPlay();
// Template Method
public final void play(){
// 초기화
initialize();
// 게임 시작
startPlay();
// 게임 종료
endPlay();
}
}
위 코드에서 Game 클래스는 initialize(), startPlay(), endPlay() 메소드를 추상화한 추상 클래스입니다. 이 클래스는 play() 메소드를 가지며, 이 메소드에서는 initialize(), startPlay(), endPlay() 메소드를 호출합니다.
이제 이 Game 클래스를 구현하는 구체 클래스를 작성해 보겠습니다.
public class Cricket extends Game {
@Override
void endPlay() {
System.out.println("Cricket Game Finished!");
}
@Override
void initialize() {
System.out.println("Cricket Game Initialized! Start playing.");
}
@Override
void startPlay() {
System.out.println("Cricket Game Started. Enjoy the game!");
}
}
위 코드에서 Cricket 클래스는 Game 클래스를 상속받으며, initialize(), startPlay(), endPlay() 메소드를 오버라이드합니다. 이제 Cricket 클래스를 사용하여 게임을 실행해 보겠습니다.
public class Main {
public static void main(String[] args) {
Game game = new Cricket();
game.play();
}
}
위 예시에서는 Game 클래스의 play() 메소드를 호출하여 Cricket 클래스의 initialize(), startPlay(), endPlay() 메소드를 실행합니다. 이를 통해, Game 클래스에서 정의한 알고리즘의 구조는 고정되어 있지만, Cricket 클래스에서는 이 알고리즘의 일부 단계를 자신에 맞게 구현할 수 있습니다.
모든것이 그렇겠지만, 프로젝트의 상황에 맞게 디자인패턴을 적용할 수 있으면 활용하는것이고 그게 여의치 않다면 명확히 알지 못하고 적용하는 것보다는 적용하지 않는편이 낳다고 생각합니다.
오늘도 즐코딩 하세요^^
'JAVA > GOF Design Pattern' 카테고리의 다른 글
GOF Observer Pattern (0) | 2023.05.09 |
---|---|
GOF Abstract Factory Pattern (0) | 2023.05.08 |
GOF Iterator 패턴 (0) | 2023.04.28 |
GOF Factory method 패턴 (0) | 2023.04.26 |
GOF singleton 패턴 (0) | 2023.04.26 |