[Design Pattern] 템플릿 메소드 패턴 Template Method

상황

템플릿 메소드 패턴

정의

장점

객체지향 개발 5대 원리 SOLID 중 LSP (리스코브 치환의 원칙: The Liskov Substitution Principle)

서브 타입은 항상 기반 타입으로 교체가 가능해야 한다.

와 맞닿아 생각해볼 수 있습니다.

예제코드

AbstractDisplay.java

  public abstract class AbstractDisplay {
      public abstract void open();
      public abstract void print();
      public abstract void close();
      public final void display(){
          open();
          for(int i = 0; i < 5; i++){
              print();
          }
          close();
      }
  }

CharDisplay.java

  public class CharDisplay extends AbstractDisplay {
      private char ch;
      public CharDisplay(char ch){
          this.ch = ch;
      }
      @Override
      public void open() {
          System.out.print("<<");
      }
  
      @Override
      public void print() {
          System.out.print(ch);
      }
  
      @Override
      public void close() {
          System.out.println(">>");
      }
  }

StringDisplay.java

  public class StringDisplay extends AbstractDisplay{
      private String string;
      private int width;
  
      public StringDisplay(String string){
          this.string = string;
          this.width  = string.getBytes().length;
      }
      @Override
      public void open() {
          printLine();
      }
  
      @Override
      public void print() {
          System.out.println("|" + string + "|");
      }
  
      @Override
      public void close() {
          printLine();
      }
  
      public void printLine(){
          System.out.print("+");
          for(int i = 0; i < width; i++){
              System.out.print("-");
          }
          System.out.println("+");
      }
  }

TemplateMethodExam.java

  public class TemplateMethodExam {
      public static void main(String[] arg){
          AbstractDisplay d1 = new CharDisplay('H');
          AbstractDisplay d2 = new StringDisplay("Hello, world.");
          AbstractDisplay d3 = new StringDisplay("안녕하세요.");
  
          d1.display();
          d2.display();
          d3.display();
      }
  }

결과화면

<<HHHHH>>
+-------------+
|Hello, world.|
|Hello, world.|
|Hello, world.|
|Hello, world.|
|Hello, world.|
+-------------+
+----------------+
|안녕하세요.|
|안녕하세요.|
|안녕하세요.|
|안녕하세요.|
|안녕하세요.|
+----------------+

결론

공통(중복)사항을 상위 클래스에서 정의하고 하위 클래스에서 구체적 기능을 작성할 경우