디자인 패턴

4. Template Method - 패스트캠퍼스 백엔드 부트캠프 3기

gkss2tpt 2025. 2. 11. 11:19

1. 하위 클래스에서 구체적으로 처리한다

  • 상위 클래스에서 처리의 뼈대를 결정하고 하위 클래스에서 그 구체적 내용을 결정하는 디자인 패턴
  • 상위 클래스 쪽에 템플릿이될 메서드가 정의되어 있고, 그 메소드 정의에 추상 메소드가 사용된다.
  • 추상 메서드를 실제로 구현하는 것은 하위 클래스이다.

2. 예제

  • 추상 클래스 AbstractDisplay
public abstract class AbstractDisplay {
    // open, print, close는 하위 클래스에 구현을 맡기는 추상 메서드
    public abstract void open();
    public abstract void print();
    public abstract void close();

    // display는 AbstractDisplay에서 구현하는 메소드
    public final void display() {
        open();
        for (int i = 0; i < 5; i++) {
            print();
        }
        close();
    }
}
  • class CharDisplay
public class CharDisplay extends AbstractDisplay{
    private char ch;    // 표시해야 하는 문자

    // <<"print()">>

    // 생성자
    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(">>");
    }
}
  • class StringDisplay
public class StringDisplay extends AbstractDisplay{
    private String string;  // 표시해야 하는 문자열
    private int width;      // 문자열의 길이

    // 생성자
    public StringDisplay(String string){
        this.string = string;
        this.width = string.length();
    }

    @Override
    public void open(){
        printLine();
    }

    @Override
    public void print() {
        System.out.println("|" + string + "|");
    }

    @Override
    public void close(){
        printLine();
    }

    // open과 close에서 호출되어 "+-----+" 문자열을 표시하는 메소드
    private void printLine() {
        System.out.print("+");
        for(int i = 0; i < width; i++){
            System.out.print("-");
        }
        System.out.println("+");
    }
}
  • Main
public class Main {
    public static void main(String[] args) {
        // 'H'를 가진 CharDisply 인스턴스를 하나 만든다
        AbstractDisplay d1 = new CharDisplay('H');

        // "Hello, world."를 가진 StringDisplay 인스턴스를 하나 만든다
        AbstractDisplay d2 = new StringDisplay("Hello, world.");

        // d1,d2 모두 같은 AbstractDisplay의 하위 클래스의 인스턴스이므로
        // 상속한 display 메소드를 호출할 수 있다.
        // 실제 동작은 CharDisplay나 StringDisplay 클래스에서 정해진다
        d1.display();
        d2.display();
    }
}
  • 결과