템플릿 모드


템플릿 패턴에서 추상 클래스는 해당 메서드를 실행하는 방법/템플릿을 공개적으로 정의합니다. 해당 하위 클래스는 필요에 따라 메서드 구현을 재정의할 수 있지만 호출은 추상 클래스에 정의된 방식으로 이루어집니다. 이러한 유형의 디자인 패턴은 행동 패턴입니다.

Introduction

의도: 한 번의 작업으로 알고리즘의 골격을 정의하고 일부 단계는 하위 클래스로 연기합니다. 템플릿 메서드를 사용하면 하위 클래스가 알고리즘 구조를 변경하지 않고도 알고리즘의 특정 단계를 재정의할 수 있습니다.

주요 솔루션: 일부 메서드는 일반적이지만 이 메서드는 모든 하위 클래스에서 다시 작성됩니다.

사용 시기: 몇 가지 일반적인 방법이 있습니다.

해결 방법: 이러한 일반 알고리즘을 추상화하세요.

키 코드: 추상 클래스에서 구현되고, 다른 단계는 하위 클래스에서 구현됩니다.

적용 예: 1. 집을 지을 때 기초, 배선, 수도관은 동일하지만 건축 후반부에만 벽장과 울타리를 추가하는 등의 차이가 있습니다. 2. 『서유기』에서 보살이 정한 81가지 어려움은 최상위 수준의 논리적 틀이다. 3. Spirng의 Hibernate 지원은 트랜잭션 열기, 세션 얻기, 세션 닫기 등과 같은 미리 결정된 몇 가지 방법을 캡슐화합니다. 프로그래머는 표준화된 코드를 반복적으로 작성할 필요가 없으며 간단히 엔터티를 던져 코드를 저장할 수 있습니다.

장점: 1. 상수 부분을 캡슐화하고 가변 부분을 확장합니다. 2. 유지 관리를 용이하게 하기 위해 공개 코드를 추출합니다. 3. 동작은 상위 클래스에 의해 제어되고 하위 클래스에 의해 구현됩니다.

단점: 각각의 구현에는 하위 클래스를 구현해야 하므로 클래스 수가 늘어나고 시스템이 더 커집니다.

사용 시나리오: 1 동일한 논리를 가진 여러 하위 클래스에 공통된 메서드가 있습니다. 2. 중요하고 복잡한 방법은 템플릿 방법으로 간주될 수 있습니다.

참고: 악의적인 작업을 방지하기 위해 일반적으로 최종 키워드가 템플릿 메서드에 추가됩니다.

Implementation

작업을 정의하는 Game 추상 클래스를 생성합니다. 여기서 템플릿 메서드는 재정의되지 않도록 final로 설정됩니다. CricketFootballGame을 확장하는 엔터티 클래스이며 추상 클래스의 메서드를 재정의합니다.

TemplatePatternDemo, 데모 클래스에서는 Game을 사용하여 템플릿 패턴의 사용법을 보여줍니다.

template_pattern_uml_diagram.jpg

1단계

템플릿 메소드가 final로 설정된 추상 클래스를 만듭니다.

Game.java

public abstract class Game {
   abstract void initialize();
   abstract void startPlay();
   abstract void endPlay();

   //模板
   public final void play(){

      //初始化游戏
      initialize();

      //开始游戏
      startPlay();

      //结束游戏
      endPlay();
   }
}

2단계

위 클래스를 확장하는 엔터티 클래스를 만듭니다.

Cricket.java

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!");
   }
}

Football.java

public class Football extends Game {

   @Override
   void endPlay() {
      System.out.println("Football Game Finished!");
   }

   @Override
   void initialize() {
      System.out.println("Football Game Initialized! Start playing.");
   }

   @Override
   void startPlay() {
      System.out.println("Football Game Started. Enjoy the game!");
   }
}

3단계

Game의 템플릿 메소드 play()를 사용하여 게임이 어떻게 정의되는지 보여줍니다.

TemplatePatternDemo.java

public class TemplatePatternDemo {
   public static void main(String[] args) {

      Game game = new Cricket();
      game.play();
      System.out.println();
      game = new Football();
      game.play();		
   }
}

4단계

출력을 확인합니다.

rreee