Template Method (템플릿 메소드 패턴)

|

Template Pattern

상속 을 이용해서 프로그램의 동작을 변경할 수 있다. Strategy 패턴과 다른 점은 Strategy는 위임을 사용해서 프로그램의 동작을 변경한다는 것이다.

상위 클래스의 템플릿 메소드에서 알고리즘이 기술되어 있고, 하위 클래스에서는 알고리즘을 일일이 기술할 필요가 없다.

템플릿 메소드 패턴에서는 상위 클래스와 하위 클래스가 긴밀하게 연동되어 있기 때문에 상위 클래스의 알고리즘을 이해 하고 하위 클래스를 작성해야 한다.

예 : 문자열 다양한 형태로 출력하기

AbstractDisplay.java

public abstract class AbstractDisplay {
    public abstract void open();
    public abstract void print();
    public abstract void close();
    public final void display() {
        open();
        print();
        close();
    }

}

추상클래스를 사용하여 필요한 알고리즘을 정의한다. display() 메서드는 추상 메서드가 아니므로 재정의가 필수가 아니다.

AbstractDisplay.java

public class CharDisplay extends AbstractDisplay {
    private char ch;
    public CharDisplay(char ch) {
        this.ch = ch;
    }

    @Override
    public void open() {
        System.out.println("<");
    }

    @Override
    public void print() {
        System.out.println(ch);
    }

    @Override
    public void close() {
        System.out.println(">");
    }
}

추상클래스인 AbstractDisplay를 상속받아 char 하나를 받아 출력하는 클래스를 작성한다. 필요한 abstract 메소드들인 open(), print(), close()를 재정의한다.

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();
    }

    private void printLine() {
        System.out.println("+");
        for(int i = 0; i < width; i++) {
            System.out.println("-");
        }
        System.out.println("+");
    }
}

추상클래스인 AbstractDisplay를 상속받아 char 하나를 받아 출력하는 클래스를 작성한다. 필요한 abstract 메소드들인 open(), print(), close()를 재정의한다.

Main.java

public class Main {
    public static void main(String[] args) {
        AbstractDisplay d1 = new CharDisplay('H');

        AbstractDisplay d2 = new StringDisplay("Hello, world");

        AbstractDisplay d3 = new StringDisplay("안녕하세요 .");

        d1.display();
        d2.display();
        d3.display();
    }
}

세 가지 형태의 Display를 출력해 본다. 세가지 클래스 모두 같은 형태의 알고리즘을 사용하고 display()를 호출하지만 각각 다른 방법을 사용하여 문자를 출력한다.