728x90
디자인 패턴 공부용으로 블로그에 기록을 해본다.
공부에 참고한 자료로는 "Java 언어로 배우는 디자인 패턴 입문" 을 참고 하였다.
정의
템플릿의 기능을 가진 패턴으로 상위 클래스쪽에 템플릿에 해당하는 메소드가 정의 되어 있고, 그 메소드의 정의 안에는 추상 메소드가 사용되고 있다. 따라서 상위 클래스의 프로그램만 보면 추상 메소드를 어떻게 사용하고 있는지 알 수 있지만, 최종적으로 어떤 처리가 수행되는지 알 수는 없다.
추상 메소드를 실제로 구현하는 것은 하위 클래스들이다. 하위 클래스 측에서 메소드를 구현하면 구체적인 처리가 결정된다. 서로 다른 하위 클래스가 서로 다른 구현을 하면 서로 다른 처리가 실행된다. 그러나 어떤 하위 클래스에서 어떤 구현을 하더라도 큰 틀은 상위 클래스에서 결정한대로 이루어진다.
즉, 상위 클래스에서 뼈대를 결정하고, 하위 클래스에서 그 구체적인 내용을 결정하는 디자인 패턴을 'Template Method 패턴' 이라고 부른다.
예제 프로그램
입력 된 파라미터를 Print 하는 추상 클래스가 있고 이를 이용해 Char, String으로 각각 프린트를 하는 하위 클래스를 만들어 보자.
클래스 설명
이름 | 해설 |
AbstractDisplay | 메소드 display만 구현되고 잇는 추상 클래스 |
CharDisplay | 메소드 open, print, close를 구현하고 있는 클래스 |
StringDisplay | 메소드 open, print, close를 구현하고 있는 클래스 |
Main | 동작 테스트용 클래스 |
AbstractDisplay 클래스
package Template;
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 클래스
package Template;
public class CharDisplay extends AbstractDisplay {
char c;
public CharDisplay(char c) {
this.c = c;
}
@Override
public void open() {
System.out.print("<<");
}
@Override
public void print() {
System.out.print(c);
}
@Override
public void close() {
System.out.println(">>");
}
}
StringDisplay 클래스
package Template;
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.print("+");
for (int i = 0; i < width; i++) {
System.out.print("-");
}
System.out.println("+");
}
}
Main 클래스
package Template;
public class Main {
public static void main(String[] args) {
AbstractDisplay d1 = new CharDisplay('H');
AbstractDisplay d2 = new StringDisplay("Hellow, world");
d1.display();
d2.display();
}
}
위의 Main 클래스의 실행 결과를 보면 다음과 같다.
<<HHHHH>>
+-------------+
|Hellow, world|
|Hellow, world|
|Hellow, world|
|Hellow, world|
|Hellow, world|
+-------------+
Process finished with exit code 0
어떤 경우에 사용하는 것일까?
어떤 틀을 하나 만들고 해당 틀로 처리를 하는 방식을 여러가지 나눌때 쓰면 될 것 같다.
'디자인패턴' 카테고리의 다른 글
[Java] Singleton 패턴 (0) | 2022.04.12 |
---|---|
[Java] Prototype 패턴 (0) | 2022.04.12 |
[Java] Factory 패턴 (0) | 2022.04.05 |
[Java] Adapter 패턴 (0) | 2022.04.03 |
[Java] Iterator 패턴 (0) | 2022.03.31 |