
Template Method Pattern
오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(오라클SQL, 튜닝, 힌트,자바프레임워크,
안드로이드, 아이폰, 닷넷 실무전문 강의)
www.onjprogramming.co.kr
상위클래스 쪽에 템플릿이 되는 메소드가 정의되어 있고 , 그 메소드의 정의내에는 추상메소드가 사용되너 상위클래스만 보면 추상메소드가 어떤식으로 호출되는지 알수있지만 최종적으로 어떤 처리를 하는지 모른다.
하위클래스에서 어떠한 처리를 하는지에 관계없이 큰 틀은 상위클래스가 결정한데로 처리된다. 실제로 어떤일을 하는지는 하위클래스의 구현된 내용을 봐야 한다.
상위클래스의 템플릿 메소드에 알고리즘이 기술되어 있으므로 하위클래스에서는 알고리즘을 일일이 기술할 필요가 없다. (개개의 하위클래스에 일일이 알고리즘을 기술한다면 수정사항이 발생되면 일일이 개별 하위클래스를 수정해야 한다.)
// 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();
}
}
// GreetingDisplay.java
public class GreetingDisplay extends AbstractDisplay {
private String s;
public GreetingDisplay(String s) { this.s =s; }
public void open() {
System.out.println("hello " + s);
}
public void print() {
System.out.println("your name is " + s);
}
public void close() {
System.out.println("bye~ " + s);
}
}
// 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;
}
public void open() { printLine(); }
public void print() { System.out.println("|" + string + "|"); }
public void close() { printLine(); }
private void printLine() {
System.out.print("+");
for (int i = 0; i < width; i++) { System.out.print("-"); }
System.out.println("+");
}
}
// Main.java
public class Main {
public static void main(String[] args) {
AbstractDisplay d1 = new GreetingDisplay("이종철");
AbstractDisplay d2 = new StringDisplay("Hello, world.");
AbstractDisplay d3 = new StringDisplay("안녕하세요~");
d1.display();
d2.display();
d3.display();
}
}
상위클래스 쪽에 템플릿이 되는 메소드가 정의되어 있고 , 그 메소드의 정의내에는 추상메소드가 사용되너 상위클래스만 보면 추상메소드가 어떤식으로 호출되는지 알수있지만 최종적으로 어떤 처리를 하는지 모른다.
하위클래스에서 어떠한 처리를 하는지에 관계없이 큰 틀은 상위클래스가 결정한데로 처리된다. 실제로 어떤일을 하는지는 하위클래스의 구현된 내용을 봐야 한다.
상위클래스의 템플릿 메소드에 알고리즘이 기술되어 있으므로 하위클래스에서는 알고리즘을 일일이 기술할 필요가 없다. (개개의 하위클래스에 일일이 알고리즘을 기술한다면 수정사항이 발생되면 일일이 개별 하위클래스를 수정해야 한다.)
// 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();
}
}
// GreetingDisplay.java
public class GreetingDisplay extends AbstractDisplay {
private String s;
public GreetingDisplay(String s) { this.s =s; }
public void open() {
System.out.println("hello " + s);
}
public void print() {
System.out.println("your name is " + s);
}
public void close() {
System.out.println("bye~ " + s);
}
}
// 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;
}
public void open() { printLine(); }
public void print() { System.out.println("|" + string + "|"); }
public void close() { printLine(); }
private void printLine() {
System.out.print("+");
for (int i = 0; i < width; i++) { System.out.print("-"); }
System.out.println("+");
}
}
// Main.java
public class Main {
public static void main(String[] args) {
AbstractDisplay d1 = new GreetingDisplay("이종철");
AbstractDisplay d2 = new StringDisplay("Hello, world.");
AbstractDisplay d3 = new StringDisplay("안녕하세요~");
d1.display();
d2.display();
d3.display();
}
}
댓글 없음:
댓글 쓰기