본문 바로가기

DesignPattern

template pattern

template pattern

template pattern 추상 클래스를 선언한우 기능의 구현은 상속받은 하위 클래스가 한다.

상위 추상클래스는 기능의 흐름을 결정하고 하위클래스는 구체적인 내용을 결정한다.

TemplateUML

상위 추상클래스를 상속받아  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 stub

this.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

연습문제.

  1. public final void display(){}  에서 final 은??>>>>……

    final을 사용함으로써 메소드 override를 방지한다.

   2. java.io.InputStream의 하위 클래스 에서 구현할 메소드를 조사.

 – java.io

Class InputStream

Input Stream 을 상속받은 하위클래스 들

read()메소드가 반복 호출되고 있다. 구체적인 내용은 하위클래스에게 맡기고  지정한 것을 지정위치로 읽어들인다는 처리의 템플릿을 만들게 된다.

3.템플릿 패턴에  인터페이스를 사용할 수 없는 이유는 ?

 

추상클래스에서는 일부 메소드를 구체적으로 구현 할 수있지만, 인터페이스는 모든 메소드를 추상 메소드로 해야하기때문에 템플릿 패턴에는 맞지 않는다.


'DesignPattern' 카테고리의 다른 글

Clean Architecture 번역  (0) 2017.12.26
Singlton pattern  (0) 2016.05.18
Iterator Pattern  (0) 2016.05.18
Factory pattern  (0) 2016.05.18
Adapter Pattern  (0) 2016.05.18