template pattern 추상 클래스를 선언한우 기능의 구현은 상속받은 하위 클래스가 한다.
상위 추상클래스는 기능의 흐름을 결정하고 하위클래스는 구체적인 내용을 결정한다.
상위 추상클래스를 상속받아 string,char을 출력하는 예제이다.
AbstracDisplay.java
package template;
public abstract class AbstracDisplay {
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();//마지막으로 close한다. 이것이 display 메소드에서 구현되고 있는 내
};
}
CharDisplay.java
package template;
public class CharDisplay extends AbstracDisplay {
private char ch;
public CharDisplay(char ch) {
// TODO Auto-generated constructor stubthis.ch =ch;
}
@Override
public void open() {
// TODO Auto-generated method stub
System.out.print(“<<“);
}@Override
public void print() {
// TODO Auto-generated method stub
System.out.print(ch);
}@Override
public void close() {
// TODO Auto-generated method stub
System.out.println(“>>”);
}}
StringDisplay.java
package template;
public class StringDisplay extends AbstracDisplay{
private String string;
private int width;public StringDisplay(String string) {
// TODO Auto-generated constructor stub
this.string=string;
this.width=string.getBytes().length;}
@Override
public void open() {
// TODO Auto-generated method stub
printLine();
}@Override
public void print() {
// TODO Auto-generated method stub
System.out.println(“|”+string+”|”);
}@Override
public void close() {
// TODO Auto-generated method stub
printLine();
}
public void printLine()
{
System.out.print(“+”);
for(int i =0;i<width;i++){
System.out.print(“-“);}
System.out.println(“+”);
}}
Main.java
package template;
public class Main {
public static void main(String[] args){
AbstracDisplay ch = new CharDisplay(‘H’);
AbstracDisplay st = new StringDisplay(“Hello”);
ch.display();
st.display();
}
}
출력 결과 :
<<HHHHH>>
+—–+
|Hello|
|Hello|
|Hello|
|Hello|
|Hello|
+—–+
템플릿 패턴의 사용 이점 .
상위 클래스의 템플릿 메소드에서 알고리즘이 기술되어 있으므로, 하위 클래스측에서는 알고리즘을 일일이 기술할 필요가 없습니다.
수정시 하위 템플릿 메소드 만을 수정하면 된다.
예제에서는 AbstractDisplay 형의 변수에 대입하고 있다. 그 변수에 하위 클래스형의 인트턴스가 대입된다.
이때 instanceof 등으로 하위 클래스의 종류를 특정하지 않아도 프로그램이 작동하도록 만드는 것이 좋다.
“상위 클래스 형의 변수에 하위 클래스의 어떠한 인스턴스를 태입해도 제대로 작동 할 수있도록 한다. “는 원칙은 상속의 일반적인 원칙 LSP..공부하고 업데이트 해야겠다.
추상클래스에서는 처리의 흐름을 결정하는 것이 중요하다. !!!!!!!!!!!!1
연습문제.
public final void display(){} 에서 final 은??>>>>……
final을 사용함으로써 메소드 override를 방지한다.
2. java.io.InputStream의 하위 클래스 에서 구현할 메소드를 조사.
Class InputStream
- java.lang.Object
- java.io.InputStream
- All Implemented Interfaces:
- Closeable, AutoCloseable
Input Stream 을 상속받은 하위클래스 들
read()메소드가 반복 호출되고 있다. 구체적인 내용은 하위클래스에게 맡기고 지정한 것을 지정위치로 읽어들인다는 처리의 템플릿을 만들게 된다.
3.템플릿 패턴에 인터페이스를 사용할 수 없는 이유는 ?
추상클래스에서는 일부 메소드를 구체적으로 구현 할 수있지만, 인터페이스는 모든 메소드를 추상 메소드로 해야하기때문에 템플릿 패턴에는 맞지 않는다.