본 내용은 Java언어로 배우는 디자인패턴 입문(한빛미디어) 책을 보면서 정리한 내용입니다.
예제의 UML 다이어그램은 다음과 같다.
AbstractDisplay의 코드는 다음과 같다.
abstract class AbstractDisplay { //추상 클래스 AbstractDisplay
public abstract void open(); //하위 클래스에 구현을 맡기는 추상메소드(1) open
public abstract void print(); //하위 클래스에 구현을 맡기는 추상메소드(2) print
public abstract void close(); //하위 클래스에 구현을 맡기는 추상메소드(3) close
public final void display() { //추상 클래스에 구현하고 있는 메소드 display
open(); //우선 open하고
for(int i = 0; i < 5; i++) {
print();
}
close(); // 마지막으로 close한다. 이것이 display 메소드에서 구현하고 있는 내용
}
}
실제 구현인 open(), print(), close()는 추상 메서드로써 하위 클래스에게 구현하도록 하고, display() 메서드 에서는 메서드의 실행 흐름이 명시되어있다.
display() 메서드는 final 키워드를 이용하여, 오버라이딩 하지 못하게 한다. 그래야 모든 AbstractDisplay 클래스의 하위 클래스들이 올바른 템플릿을 사용하게 된다.
CharDisplay의 코드는 다음과 같다.
class CharDisplay extends AbstractDisplay { //CharDisplay는 AbstractDisplay의 하위 클래스
private char ch;
public CharDisplay(char ch) {
this.ch = ch;
}
public void open() {
System.out.print("<<");
}
public void print() {
System.out.print(ch);
}
public void close() {
System.out.println(">>");
}
}
하위 클래스는 상위 메서드에서 제공했던 open(), print(), close()의 실제 구현을 담고 있다.
실제 코드를 사용하는 Main 클래스는 다음과 같다.
class Main {
public static void main(String[] args) {
AbstractDisplay d1 = new CharDisplay('H'); // 'H'를 가진 CharDisplay의 인스턴스를 1개 만든다.
AbstractDisplay d2 = new StringDisplay("Hello, world."); // "Hello, world."를 가진 StringDisplay의 인스턴스를 1개 만든다.
AbstractDisplay d3 = new StringDisplay("안녕하세요"); // "안녕하세요" 를 가진 StringDisplay의 인스턴스를 1개 만든다.
d1.display(); // d1, d2, d3 모두 같은 AbstractDisplay의 하위 클래스의 인스턴스이기 때문에 상속한 display 메소드 호출 가능
d2.display(); // 실제의 동작은 각 클래스 CharDisplay나 StringDisplay에서 정한다.
d3.display();
}
}
Main 클래스의 main 함수에서는 AbstractDisplay 객체에 CharDisplay(), StringDisplay() 인스턴스를 연결해서 선언한다.
그 후에 display() 메서드를 실행하는 식으로 template method pattern을 구현해본다.
실제 패턴의 UML 다이어그램은 다음과 같다.
이 부분은 아직 이해가 안되서, 추후에 보강하겠음.